-1

わかりましたので、64 個の JButton の配列を 8 x 8 のグリッド レイアウト (チェス盤のようなもの) で JFrame に追加しようとしています。関連するコードセクションは次のとおりです。

public class othello implements ActionListener{
int [][] board = new int[8][8];
JFrame window = new JFrame();
JButton[] buttons = new JButton[64];

public othello(){

window.setSize(400,400);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setLayout(new GridLayout(8,8));
window.setVisible(true);
    for (int i=0;i<64;i++){
        buttons[i] = new JButton("");
        buttons[i].addActionListener(this);
        window.add(buttons[i]);
    }
    for (int i=0;i<8;i++){
        for (int j=0;j<8;j++){
            board[i][j]=2;
        }
    }
    board[3][3]=0;board[4][4]=0;
    board[3][4]=1;board[4][3]=1;
}

public void actionPerformed(ActionEvent e){
    for (int i=0;i<8;i++){
        for (int j=0;j<8;j++){
            if(e.getSource()==buttons[i]){
                buttons[i].setEnabled(false);
                board[i][j]=1;
                check();
            }
        }
    }
}

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

}

このコードの結果は、一見乱数のボタンが実際に追加されているように見えます。場合によっては 64 個すべてを追加することもあれば、通常は半分程度追加することもあります。常に適切に開始されますが、任意の時点で停止します (ボタン ラベルをカウントアップしてテストしました)。

ループ自体が実際に完了しているかどうかを確認するためにいくつかの println を追加しましたが、問題はありません。ループを 64 回すべて回っています。ある時点でボタンの追加が停止するだけです。

私はJavaの初心者なので、本当に単純でばかげていると確信していますが、現在、何が問題なのかわかりません。誰でも助けることができますか?

より多くのコード用に編集されました。

4

3 に答える 3

1

アレイを初期化しましたか?お気に入り

JButton[] buttons = new JButtons[x];

いくつかの印刷を行って、ループが停止する数を確認します。

于 2012-05-01T19:43:22.677 に答える
0

UI の操作にイベント ディスパッチ スレッドを使用していないのではないでしょうか?

Swingチュートリアルから:

すべてのイベント処理コードが実行されるイベント ディスパッチ スレッド。Swing フレームワークとやり取りするほとんどのコードも、このスレッドで実行する必要があります。

を使用して UI 構築コードを実行してみてくださいSwingUtilities.invokeAndWait()

編集: 修正されたソース コードは次のようになります。

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class othello implements ActionListener
{
    int[][] board = new int[8][8];
    JFrame window = new JFrame();
    JButton[] buttons = new JButton[64];

    public othello()
    {
        try
        {
            SwingUtilities.invokeAndWait(new Runnable()
            {
                public void run()
                {
                    window.setSize(400, 400);
                    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    window.setLayout(new GridLayout(8, 8));
                    window.setVisible(true);
                    for (int i = 0; i < 64; i++)
                    {
                        buttons[i] = new JButton("");
                        buttons[i].addActionListener(othello.this);
                        window.getContentPane().add(buttons[i]);
                    }
                    for (int i = 0; i < 8; i++)
                    {
                        for (int j = 0; j < 8; j++)
                        {
                            board[i][j] = 2;
                        }
                    }
                    board[3][3] = 0;
                    board[4][4] = 0;
                    board[3][4] = 1;
                    board[4][3] = 1;
                }
            });
        }
        catch (Exception e)
        {
            // TODO Handle exception
            e.printStackTrace();
        }
    }

    public void actionPerformed(ActionEvent e)
    {
        for (int i = 0; i < 8; i++)
        {
            for (int j = 0; j < 8; j++)
            {
                if (e.getSource() == buttons[i])
                {
                    buttons[i].setEnabled(false);
                    board[i][j] = 1;
                    // check();
                }
            }
        }
    }

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

}
于 2012-05-01T19:48:40.963 に答える
0

に直接ではなく、ContentPane に追加する必要があります。JFrame.add()

他のすべての JFC/Swing トップレベル コンテナと同様に、JFrame には JRootPane が唯一の子として含まれています。ルート ペインによって提供されるコンテンツ ペインには、原則として、JFrame によって表示されるすべての非メニュー コンポーネントを含める必要があります。

レイアウトマネージャをデフォルト以外に設定していませんか?

デフォルトのコンテンツ ペインには、BorderLayout マネージャーが設定されます。JFrame の LayoutManager の追加、削除、および設定の詳細については、RootPaneContainer を参照してください。

コンテンツを追加するための適切な慣用コードは次のとおりです。

window.getContentPane().add(child);

適切な使用方法の詳細については、Javadocを参照してください。

于 2012-05-01T19:52:00.743 に答える