2017-12-02 366 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