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

时间:2017-12-02 18:04:23

标签: java swing jframe jpanel jtextfield

(一般性问题)

我有一个作业,我必须在其中构建一个数独游戏,我想到构建它的类/逻辑,并认为我可以使用建议。

我想使用JFrame并在其上构建一个带有TextFields的JPanel(用户应该“解决”数独游戏)。

我有一个名为“DrawSudoku”的类,它绘制一个空板。 我必须首先绘制一个空板,因此“用户”可以在其中键入数字。 在那个板上我必须检查一些逻辑。所以我必须自己访问textFields。

到目前为止,我已经完成了所有工作。现在我正在考虑用董事会背后的“逻辑”来构建另一个类。

但我遇到了一个问题 如何从另一个类中获取JPanel上存在的JTextField?

我可以为它后面的绘图和逻辑设置单独的类吗? 谢谢!

2 个答案:

答案 0 :(得分:2)

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

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

然后,通过创建绘图类的实例在逻辑类中调用此方法:

DrawSudoku drawer = new DrawSudoku();
drawer.setSquareText("6", 1,1);

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

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

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

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

答案 1 :(得分:2)

  

在那个板上,我必须检查一些逻辑。所以我必须自己访问textFields。

不一定

  

如何从另一个类中获取JPanel上存在的JTextField?

如何通过访问器或“getter”方法评估来自另一个对象的任何对象的状态。

  

我可以为它后面的绘图和逻辑设置单独的类吗?

你不仅可以

如果这是我的项目,我会考虑做以下事情:

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

通过这种类型的设置,外部类可以监听模型的更改,而不必直接访问视图的JTextField。