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 メソッドは、ボタンを配列に追加し、直後にパネルに追加します。

4

2 に答える 2

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]);
      }
   }
}
于 2012-12-09T13:40:30.080 に答える
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);
  3. setSize(500,500);使用する代わりにpanel.setPreferredSize(new Dimension(500,500));。または、幅または高さの最大の優先サイズに等しい優先サイズを返す aJButtonを作成するために拡張します。SquareButton最後に、GUI が必要なサイズ、正方形であり、テキストを表示するのに十分なスペースがあることを確認します。
  4. ポイント2にリンクされている回答に見られるようにsetLocationRelativeTo(null);使用する代わりに.setLocationByPlatform(true);
  5. GUI がコンテンツを表示するために必要なサイズであることを確認するpack()前に追加します。setVisible(true);
  6. setResizable(false)呼び出す代わりにsetMinimumSize(getSize())
  7. EDT で GUI を起動および更新します。詳細については、Swingでの同時実行を参照してください。
于 2012-12-09T13:42:47.927 に答える