2012-12-09 7 views
4

9x9 JButton으로 만든 간단한 tic tac toe 보드를 만들려고합니다. 2 차원 배열과 gridlayout을 사용했지만 그 결과는 아무런 버튼도없는 프레임입니다. 내가 뭘 잘못하고있어?gridlayout을 사용하여 버튼 추가하기

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); 대신 this answer에 표시된대로 setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);을 사용하십시오.
  3. setSize(500,500); 대신 panel.setPreferredSize(new Dimension(500,500));을 사용하십시오. 또는 더 좋게도 JButton을 확장하여 가장 큰 너비 나 높이의 기본 설정과 동일한 기본 크기를 반환하는 SquareButton으로 만듭니다. 마지막으로 GUI가 필요한 크기인지 확인하고, & 사각형을 사용하여 텍스트를 표시 할 수 있습니다.
  4. 대신 내용을 표시하기 위해, 그것은 할 필요가 크기 인 GUI를 보장 setVisible(true); 전에 pack() 추가
  5. 점 2에 링크 된 답변에서 볼 수 있듯이 사용 setLocationByPlatform(true);setLocationRelativeTo(null);의.
  6. setResizable(false) 대신 setMinimumSize(getSize())을 호출하십시오.
  7. & 시작 EDT의 GUI를 업데이트하십시오. 자세한 내용은 Concurrency in Swing을 참조하십시오.
+1

이러한 조언을 주셔서 감사합니다. 나는 항상 setsize와 preferredsize와 당신이 언급 한 다른 것들을 혼동했고 무엇을 사용해야할지 몰랐습니다. 다시 한 번 감사드립니다! –

관련 문제