Building a GUI for a Sudoku Solver (Complete with ASCII Example)(为数独求解器构建 GUI(完整的 ASCII 示例))
问题描述
.
概览,示例
大家好,
我创建了一个基本的数独求解器,可以相当快地解决大多数问题.我还有很多工作要做,才能让它解决最困难的问题,但我想先尝试实现一个基本的 JFrame GUI.
我过去曾使用过互联网小程序,但以前从未使用过 JFrames.
我想创建类似于下图的东西(对于初学者):
.
具体说明
:左拼图
- 应明确定义 9x9 部分(中间的线;单独的框)
- 文本框应该只接受数字/只允许输入一个数字(如果可能的话)
:正确的谜题
- 应明确定义 9x9 部分(中间的线;单独的框)
- 框是否可以编辑无关紧要,只要它们可以显示结果即可
:按钮在中心
- 应该运行 [SudokuPuzzle].solve();
:底部文本框
- 不应编辑
.
我在寻找什么
我从过去的经验中知道这都可以在 JFrame 中完成,但是因为我自己从未构建过一个,所以我不太确定是哪个
(注意:数值是随机的)
用法
你所要做的就是实现接口:
只需在此方法中进行所有计算并使用 resultAcceptor.setSudokuResult()
这是实际显示 GUI 的方法:
仅此而已!
代码
所有类都在默认包中 - 随心所欲地重构.以下是它们的列表:
- SudokuView - 主界面
- SudokuRun - 跑步者示例
- SudokuController - 允许以安全的方式控制视图
- SudokuImplementation - 数独实现的接口
- DummySudokuImplementation - 示例实现
1.数独视图:
2.数独:
3.数独控制器:
4.数独实现:
5.虚拟数独实现:
说明
我并没有声称我的做法是最好的.我很想看到其他答案,比如说,所有视图都是用 MigLayout 完成的.这将是非常有启发性的.当 Sun 的实现只有一个时,我正在学习 Swing GUI,所以它在我的风格中占了上风.也就是说,我建议参考 Sun 的 Swing GUI 短期课程.它还包括一个简单的研究案例.读完之后,SudokuView 几乎整个部分都应该清楚了.
我确实将代码分开以使其更具可读性.这就是为什么控制器是另一个类,而不是视图的一部分.该视图仅用于构建小部件和布局,但为了使其简单(而不是创建更多类),我还在其中初始化控制器.
真正的工作是在控制器中.它包含最毛茸茸的细节......线程也在那里,所以它实际上做了什么并不那么明显.我从头开始实现了一个 Thread 类.还有另一种选择:使用 SwingWorker.这可能是陈词滥调,但要明确一点:我使用线程来使 GUI 随时响应.如果没有适当的线程,整个 GUI 将在计算发生时冻结.我决定从 Sudoku 的实现角度使其尽可能简单,例如非阻塞增量更新.
至于线程,了解哪些代码在哪个线程中运行至关重要.GUI 组件触发的每个操作都在 EDT(事件调度线程)上运行.如果您对其执行任何长时间运行的任务,GUI 将不会响应.所以我只是创建另一个线程(参见 goButtonPressed()
的实现)并启动它.之后,EDT 可以在不阻塞的情况下处理任何其他事件.
所以你的数独在一个特殊的后台线程中运行.它可以为所欲为,除非它必须更新 GUI.几乎可以肯定它会,因为那是部分更新的地方.这里有一个问题:如果您直接调用任何 GUI 组件(设置一些值),那么 GUI 将冻结.这是一种称为 EDT 调度违规的情况.与 Swing 的所有交互都应在 EDT 上完成,以避免任何冻结.怎么做?EDT 有专门的事件队列.您在队列中发布了一个更新事件.在 EDT 上,代码一直在监视传入的事件并相应地更新 GUI.所以基本上,这是后台线程和 EDT 之间的通信.在队列上发布事件您可以使用专门为此设计的特殊实用程序方法:EventQueue.invokeLater(new Runnable() {/* 这是您的 GUI 交互 *