我刚刚写完了一个数独求解器。它有两个类,一个控制台求解器和一个gui求解器。 控制台解算器有一个名为solve的方法,它以递归方式解决了数独。 gui扩展了控制台求解器并使用了它的求解方法。通过在执行另一个递归调用之前打印出方法内部的sudoku字段,可以很容易地跟踪每个递归步骤,如下所示:
System.out.println(field);
// solve next cell
if (j < 8) solve(field, row, column + 1);
else solve(field, row + 1, 0;
}
但是如何在gui中显示字段中的变化呢? 我使用JTable来显示gui中的sudoku字段。 目前我只显示结果,但不显示导致它的步骤,这似乎有点无聊。
这里有一些更相关的代码:
/* solve button action listener/handler */
solveButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
/* solve the sudoku and display it
* in solve table.
*/
fieldToTable(field, solveTable); //put sudoku field in display
try {
solve(field, 0, 0); // Solve starting at [0,0]
} catch (SolvedException d) {
/* SOLVED */
}
} //End of action handler
}); // End of action listener
/* Done with solve button action listener */
答案 0 :(得分:0)
您可以在线程中“解决”它并在每次迭代中更新Board。这是一个使用Thread的基本apporach - 一个更复杂的可能会使用SwingWorker。
免责声明:您可能需要添加其他检查,最后制作一些变量,以此类推。
solveButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
/* solve the sudoku and display it in solve table. */
fieldToTable(field, solveTable); //put sudoku field in display
//Disable button while solving
solveButton.setEnabled(false);
//Start Thread to do the work
new Thread() {
public void run() {
try {
solve(field, 0, 0);
} catch(SolvedException se) {
//What now - reenable button
SwingUtilities.invokeLater(() -> solveButton.setEnabled(true));
}
}
}.start();
} //End of action handler
}); // End of action listener
更改你的solve()以在每次通话时更新电路板:
public void solve(Field field, int x, int y) {
SwingUtilities.invokeLater(() -> fieldToTable(field, solveTable));
// YOUR SOLVE LOGIC
}