2017-08-07 29 views
-3

我需要創建一個Suduku遊戲板看起來像這樣:數獨貴問題

enter image description here

這裏有我需要爲這項任務的要求,但我有一些問題。

  1. 使用兩個循環來繪製文本字段,而不是列出81個文本字段的蠻力。你應該這樣做:

    for (int k = 1; k <= 9; k++) 
        { 
         JPanel level2 = new JPanel(); 
    …. 
         for (int i = 1; i <= 9; i++) 
         { 
          JTextField text = new JTextField(); 
          … 
         } 
         gridPanel.add(level2); 
        } 
    
  2. 我需要2個班 名爲TestSudoku的應用程序的類以及名爲SudokuLayout工作類。

  3. 實現以下可視化小工具併爲它們編寫監聽器。這些小工具具有以下行爲:

    • 按鈕「重置」---單擊該按鈕時,程序將清除文本區域,然後將字符串「Reset button clicked!」輸出到文本區域。
    • 按鈕「提示」---當按鈕被點擊時,程序將清除文本區域,然後將字符串「點擊提示按鈕!」輸出到文本區域。
    • Combobox「難度」---選擇一個項目時,程序將清除文本區域,然後將所選項目名稱輸出到文本區域。
  4. 實現使用鬆耦合方法(私有偵聽器類或專用適配器類)的偵聽器。

這是我目前有..

import javax.swing.*; 
import javax.swing.border.Border; 
import java.awt.*; 

public class SudokuLayout extends JFrame { 

    public SudokuLayout() { 

     JPanel board = new JPanel(new GridLayout(9, 9)); 
     add(board); 

     JPanel[][] squares = new JPanel[9][9]; 

     Border border = BorderFactory.createLineBorder(Color.BLACK); 

     for (int row = 1; row < 9; row++) { 
      for (int col = 1; col < 9; col++) { 
       squares[row][col] = new JPanel(); 
       board.add(squares[row][col]); 
      } 
     } 

     JPanel menu = new JPanel(); 
     menu.add(new JButton("Reset")); 
     menu.add(new JButton("Hint")); 
     menu.add(new JButton("Solve")); 
     menu.add(new JButton("New Puzzle")); 

     add(menu); 
    } 

    public static void main(String[] args) { 
     /** Create a frame and set its properties*/ 
     JFrame frame = new SudokuLayout(); 
     frame.setTitle("Sudoku"); 
     frame.setSize(600, 600); 
     frame.setLocationRelativeTo(null); //Center the frame 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 
} 

的問題是,我目前的版本,右鍵菜單水平顯示,我看不出網格。而且,我不知道如何添加輸出區域。

+2

'但我有一些問題' - 你有什麼問題? –

+0

無法找出網格或選擇難度。我也不確定如何將按鈕移動到一邊。 –

+1

然後將其添加到問題中,明確說明您的問題以及您想要的幫助。就目前而言,你的問題僅僅是你想要做什麼的陳述。 –

回答

2

當用Swing面對這種框架時,需要將框架分成幾部分並分開處理。我的意思是,通過查看圖像,您可以輕鬆識別數獨,菜單和輸出。因此,您的答案應該嘗試先分別創建它們,然後加入它們。

考慮到這一點,你必須注意:

  • 有3個主要組件:數獨,菜單和輸出
  • 的3個主要組件可以使用BorderLayout,因爲他們很可能是在西,東部和南部
  • 數獨組件是一個3x3的3x3小網格網格(因此您可以更改黑邊)。
  • 菜單組件是一個5X1格,在每個位置
  • 按鈕輸出組件是一個單一的文本框

所以,你可能需要改變一些東西得到確切行爲(按鈕大小和利潤率上難度ComboBox),但您的解決方案的選擇應該是這樣的:

public class SudokuLayout extends JFrame { 

    public SudokuLayout() { 
     // Create panel for Sudoku 
     JPanel board = new JPanel(); 
     board.setLayout(new GridLayout(3, 3)); 
     board.setBorder(BorderFactory.createLineBorder(Color.BLACK)); 
     for (int row = 0; row < 3; ++row) { 
      for (int col = 0; col < 3; ++col) { 
       JPanel box = new JPanel(new GridLayout(3, 3)); 
       box.setBorder(BorderFactory.createLineBorder(Color.BLACK)); 
       for (int cell = 0; cell < 9; ++cell) { 
        box.add(new JTextField(2)); 
       } 
       board.add(box); 
      } 
     } 

     // Create difficulty combo box 
     JComboBox<String> difficultyChoices = new JComboBox<>(new String[] { "Hard", "Easy" }); 
     difficultyChoices.setSelectedIndex(0); 

     // Create menu panel 
     JPanel menu = new JPanel(); 
     menu.setLayout(new GridBagLayout()); 
     GridBagConstraints menuConstraints = new GridBagConstraints(); 

     menuConstraints.anchor = GridBagConstraints.WEST; 
     menuConstraints.weightx = 0.5; 
     menuConstraints.weighty = 0.5; 
     menuConstraints.gridwidth = 2; 

     menuConstraints.gridx = 2; 
     menuConstraints.gridy = 0; 
     menu.add(new JButton("Reset"), menuConstraints); 

     menuConstraints.gridx = 2; 
     menuConstraints.gridy = 1; 
     menu.add(new JButton("Hint"), menuConstraints); 

     menuConstraints.gridx = 2; 
     menuConstraints.gridy = 2; 
     menu.add(new JButton("Solve"), menuConstraints); 

     menuConstraints.gridx = 2; 
     menuConstraints.gridy = 3; 
     menu.add(new JButton("New Puzzle"), menuConstraints); 

     menuConstraints.weighty = 1.0; 
     menuConstraints.gridx = 2; 
     menuConstraints.gridy = 4; 
     menu.add(new JLabel("Difficulty:"), menuConstraints); 

     menuConstraints.fill = GridBagConstraints.HORIZONTAL; 
     menuConstraints.weightx = 0.5; 
     menuConstraints.weighty = 0.5; 
     menuConstraints.gridwidth = 2; 
     menuConstraints.gridx = 0; 
     menuConstraints.gridy = 5; 
     menu.add(difficultyChoices, menuConstraints); 

     // Create output panel 
     JTextArea output = new JTextArea(5, 20); 
     output.setEditable(false); 
     output.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.BLUE), "Output Area")); 

     // Join the 3 panels on the frame 
     Container cp = getContentPane(); 
     cp.setLayout(new BorderLayout()); 

     cp.add(board, BorderLayout.WEST); 
     cp.add(menu, BorderLayout.EAST); 
     cp.add(output, BorderLayout.SOUTH); 
    } 

    public static void main(String[] args) { 
     // Create a frame and set its properties 
     JFrame frame = new SudokuLayout(); 
     frame.setTitle("TestSudoku"); 
     frame.setSize(600, 600); 
     frame.setLocationRelativeTo(null); // Center the frame 

     // Setup the window 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

} 

更新:我用GridBagLayout的菜單和0123更新我的答案帶輸出的邊框。

+0

非常感謝您的幫助。我可以問你另一個問題嗎?你知道我可以在按下按鈕後創建輸出嗎?編號假設如果其他國家可能允許這樣做,但我不確定如何實施它 –

+0

*「我可以問你另一個問題嗎?」*你可以問多少,你可以做的legwork上,但每個應該是在一個單獨的問題主題 - 畢竟,這是一個問答網站。請[接受此答案](http://meta.stackexchange.com/a/5235/155831)如果它有助於解決當前的問題。 –

+0

@DanielHenrichs你可以在創建按鈕時實現'Listeners',也可以修改其他GUI元素。然而,正如@Andrew Thompson所說,考慮接受這個問題並提出另一個問題,以便我可以更多地開發它;) –