2012-12-09 176 views
4

我試圖創建一個由9x9 JButtons製作的簡單的井字踏板。 我使用了一個2d數組和一個網格佈局,但結果不算什麼,一個沒有任何按鈕的框架。 我做錯了什麼?使用網格佈局添加按鈕

import java.awt.GridLayout; 
import javax.swing.*; 


public class Main extends JFrame 
{ 
    private JPanel panel; 
    private JButton[][]buttons; 
    private final int SIZE = 9; 
    private GridLayout experimentLayout; 
    public Main() 
    { 
     super("Tic Tac Toe"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(500,500); 
     setResizable(false); 
     setLocationRelativeTo(null); 

     experimentLayout = new GridLayout(SIZE,SIZE); 

     panel = new JPanel(); 
     panel.setLayout(experimentLayout); 


     buttons = new JButton[SIZE][SIZE]; 
     addButtons(); 


     add(panel); 
     setVisible(true); 
    } 
    public void addButtons() 
    { 
     for(int k=0;k<SIZE;k++) 
      for(int j=0;j<SIZE;j++) 
      { 
       buttons[k][j] = new JButton(k+1+", "+(j+1)); 
       experimentLayout.addLayoutComponent("testName", buttons[k][j]); 
      } 

    } 


    public static void main(String[] args) 
    { 
     new Main(); 

    } 

} 

** addButton方法將按鈕添加到數組並直接添加到面板。

謝謝先進。

回答

8

您需要將按鈕添加到您的JPanel

public void addButtons(JPanel panel) { 
    for (int k = 0; k < SIZE; k++) { 
     for (int j = 0; j < SIZE; j++) { 
     buttons[k][j] = new JButton(k + 1 + ", " + (j + 1)); 
     panel.add(buttons[k][j]); 
     } 
    } 
} 
4
// add buttons to the panel INSTEAD of the layout 
// experimentLayout.addLayoutComponent("testName", buttons[k][j]); 
panel.add(buttons[k][j]); 

更多建議:

  1. 不要延長JFrame,只要保持引用一個只要有需要。只有在添加或更改功能時才延伸框架。
  2. 而不是setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);使用setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);this answer中所見。
  3. 而不是setSize(500,500);使用panel.setPreferredSize(new Dimension(500,500));。或者更好的是,延長JButton來創建一個SquareButton,返回一個首選大小等於寬度或高度最大的首選大小。最後將確保GUI的大小需要,方形&允許足夠的空間來顯示文本。
  4. 代替setLocationRelativeTo(null);使用setLocationByPlatform(true);中所見在點2
  5. 鏈接的答案setVisible(true);這確保了GUI是它需要的大小之前添加pack(),要顯示的內容。
  6. 而不是setResizable(false)請致電setMinimumSize(getSize())
  7. 開始&更新EDT上的GUI。有關更多詳細信息,請參見Concurrency in Swing
+1

非常感謝您的建議!我總是在setsize和preferredsize以及你提到的其他事情之間混淆不清,我不知道該怎麼用。再次感謝! –