【问题标题】:Java - drawing a sudoku - How to build the code in the right way?Java - 绘制数独 - 如何以正确的方式构建代码?
【发布时间】:2018-05-16 14:14:09
【问题描述】:

(一般问题)

我有一个任务,我必须构建一个数独,我考虑了构建它的类/逻辑,并认为我可以使用建议。

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

我有一个名为“DrawSudoku”的类,它可以绘制一个空棋盘。 我必须先画一个空板,所以“用户”可以在里面输入数字。 在那块板上,我必须检查一些逻辑。所以我必须自己访问文本字段。

到目前为止,这就是我所做的一切。现在我正在考虑用板子后面的“逻辑”构建另一个类。

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

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

【问题讨论】:

  • 到目前为止,是否有任何答案回答了您的问题?如果是这样,请考虑接受最有帮助的答案。

标签: java swing jframe jpanel jtextfield


【解决方案1】:

在那块板上,我必须检查一些逻辑。所以我必须自己访问文本字段。

不一定

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

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

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

不仅可以,而且绝对应该

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

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

通过这种类型的设置,外部类可以侦听模型的更改,而不必直接访问视图的 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");
    

    【讨论】:

    • 您好,谢谢!首先,我将进一步澄清我的问题(编辑完成) - 我有一个名为“DrawSudoku”的类,它绘制一个空板。 我必须先画一个空板,这样“用户”才能在其中输入数字。 在那个板上,我必须检查一些逻辑。所以我必须自己访问文本字段。 (+1)
    • 感谢您的澄清!它是您需要访问文本字段本身的任务的一部分,还是您可以编写逻辑以使用 getSquareText(...) 之类的方法检查另一个类中的板?
    • 我可以改变逻辑,是的,我对 Java - Swing 非常不好,最近才开始使用它。我很高兴有一个更好的想法。现在我有一个框架,上面有 Panel 和 textField。
    • 另一件事 - 我必须使用 Swing。
    • @Alan 您将它们与 JTextField 和 JTextArea 等文本组件的 Documents 一起使用。请参阅 MadProgrammer 的回答 here 了解更多详情。
    猜你喜欢
    • 2020-03-15
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    相关资源
    最近更新 更多