Java - 画数独 - 如何以正确的方式构建代码?

Java - drawing a sudoku - How to build the code in the right way?

(一般性问题)

我有一个任务,我必须在其中构建一个数独,我考虑 classes/logic 来构建它,并认为我可以使用建议。

我想使用 JFrame 并在其上构建带有 TextFields 的 JPanel(用户应该 "solve" 数独)。

我有一个名为 "DrawSudoku" 的 class,它绘制了一个空板。 我得先画一个空板,这样 "user" 就可以在上面输入数字了。 在那块板上我必须检查一些逻辑。所以我必须自己访问文本字段。

到目前为止,这就是我所做的一切。现在我正在考虑在板子后面再建一个 class,"logic"。

但是我遇到了一个问题 如何从另一个 class?

获取存在于 JPanel 上的 JTextFields

我可以为绘图及其背后的逻辑单独 class 吗?
谢谢!

如果您在 DrawSudoku class 中包含 public 方法,您的逻辑 class 随后可以调用这些方法,则您无需访问文本字段本身。这与为私有变量编写 getter 和 setter 方法非常相似。例如,如果您希望您的逻辑 class 能够将数字“6”写入棋盘上的某个方块,您可以在 DrawSudoku 中编写一个方法,如下所示:

public void setSquareText(String text, int row, int column) {
   // change the appropriate text field here
   textField.setText(text);
}

然后,通过生成绘图实例 class:

,在您的逻辑 class 中调用此方法
DrawSudoku drawer = new DrawSudoku();
drawer.setSquareText("6", 1,1);

或者,您可以在 DrawSudoku 中编写一个 returns 给定 JTextField 的方法,如下所示:

public JTextField getTextField(int row, int column){
    // find the appropriate text field, then return it
    return textField;
}

然后,在您的逻辑中调用此方法 class 以访问 JTextField,如下所示:

JTextField textField = drawer.getTextField(1,1);
textField.getText();
textField.setText("6");

On that board I have to check some logic. So I have to access the textFields themselves.

不一定

How do I get the JTextFields that exists on the JPanel, from another class?

您如何从另一个对象评估任何对象的状态 - 通过访问器或 "getter" 方法。

Can I have separate classes for the Drawing and Logic Behind it?

不仅你可以,你绝对应该

如果这是我的项目,我会考虑执行以下操作:

  • 首先,创建一个非 GUI 数独模型 class。这可能包括:
    • SudokuCellValue 枚举(随意命名),一个可以包含 1 到 9 的值以及可能的 EMPTY 值的枚举(尽管您可以使用 null 来表示它)
    • SudokuCell 对象,具有可编辑的布尔值,并为上述枚举保留单个值。
    • SudokuGrid 对象,一个 9 x 9 的 SudokuCells 网格。
    • 一种将侦听器挂接到模型中的机制,以便通知它们状态的变化——即一个或多个 SudokuCell 对象持有的 SudokuCellValue 的变化。视图(GUI)将是该模型的主要侦听器之一,并将在模型的状态更改时更改其显示。
  • 我会创建一个视图 class,意思是 GUI,
    • 一个持有对其模型的引用(见上文)
    • 还有一个已将侦听器附加到其模型的模型 -- 我喜欢为此使用 PropertyChangeListeners
    • 我会用 JTextFields 网格将它连接起来,
    • 这些文本字段将使用 DocumentFilter 以允许用户清除该字段或仅输入 1 到 9 位数字文本。
    • 将根据相应模型单元格的可编辑状态启用输入(或者可能更好 -- 可聚焦输入)。
  • 我会创建一个控制器来控制视图和模型之间的某些通信。

使用这种类型的设置,外部 classes 可以侦听模型的更改,而不必直接访问视图的 JTextFields。