2017-12-02 361 views
0

(一个普遍的问题)Java - 绘制数独 - 如何以正确的方式构建代码?

我有一个任务,我必须建立一个数独,我想到类/逻辑来构建它,并认为我可以使用一个建议。

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

我有一个名为“DrawSudoku”的绘制空板的类。 我必须先画一块空板,这样“用户”才能在其中输入数字。 在该板上我必须检查一些逻辑。所以我必须自己访问textFields。

到目前为止,这是我所做的一切。现在我正在考虑以董事会背后的“逻辑”来建立另一个班级。

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

我可以为其背后的绘图和逻辑单独分类吗?
谢谢!

+0

到目前为止有任何答案可以解答您的问题吗?如果是这样,请考虑接受最有用的答案。 – Keara

回答

2

该板上我要检查一些逻辑。所以我必须自己访问textFields。

不一定

我怎样存在的JPanel的,从另一个类JTextField的?

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

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

你不仅可以,你绝对是应该

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

  • 首先,创建一个非GUI数独模型类。这可能包括:
    • SudokuCellValue枚举(命名为你想要的),可容纳从1到9的值枚举,以及可能为空值(虽然你可以使用null表示此)
    • SudokuCell对象,具有可编辑布尔值的对象,并为上面的枚举保存单个值。
    • SudokuGrid对象,一个9 x 9的SudokuCells网格。
    • 将侦听器挂钩到模型中以便通知状态发生变化的机制 - 即由一个或多个SudokuCell对象持有的SudokuCellValue的更改。视图(GUI)将成为此模型的主要监听者之一,并且在模型的状态更改时将更改其显示。
  • 我想创建一个视图类,这意味着GUI,
    • 一说持有参照其模​​式(见上文)
    • 和一个上附加了听众的模型 - 我喜欢用的PropertyChangeListeners这个
    • 我把它挂与JTextField中的网格,
    • 这些文本字段将使用某个DocumentFilter以允许用户或者清除该字段或只能通过9个位数的数字文本输入1 。
    • 基于相应模型单元格的可编辑状态,将启用输入(或者可能更好 - 可输入焦点)。
  • 我会创建一个控制器来控制视图和模型之间的一些通信。

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

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"); 
+0

嗨,谢谢!首先我会更多地澄清我的问题(编辑完成) - 我有一个名为“DrawSudoku”的类,它绘制了一个空白板。 **我必须首先绘制一块空板,以便“用户”可以在其中输入数字。** 在该板上我必须检查一些逻辑。所以我必须自己访问textFields。 (+1) – Alan

+0

感谢您的澄清!是否需要自行访问文本字段,或者是否可以使用getSquareText(...)等方法编写逻辑以检查另一个类中的棋盘? – Keara

+0

我可以改变逻辑,是的,我只是非常糟糕的Java - Swing,直到最近才开始使用它。我会很高兴有一个更好的想法。现在我有一个框架,面板和textField。 – Alan