0

eclipseを使用してプログラムを実行すると、ボタンが1つだけ表示されます(左上隅)が、ターミナルでjavacを使用すると(ほとんどの場合)、すべてのボタンが表示されます。それは本当に私を悩ませています。誰か助けてもらえますか?ありがとう!
これは私のコンストラクターです:

    public TicTacToe(){
    super("Farm Tic-Tac-Toe");
    setSize(450,750);
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    Container cont = getContentPane();
    cont.setLayout(null);
    int newLine = 0;
    int lineCount = 0;
    for(int i = 0; i < buttons.length; i++){
        buttons[ i] = new JButton(blank);
        if(i == 3 || i == 6){
            newLine++;
            lineCount = 0;
        }
        buttons[ i].setBounds(lineCount*150,newLine*150,150,150);
        cont.add(buttons[ i]);
        buttons[ i].addActionListener(this);
        lineCount++;
    }
}

これがアクションリスナーです...

    public void actionPerformed(ActionEvent e){
    for(int i = 0; i < buttons.length; i++){
        if(e.getSource()==buttons[ i]){
            if(turn%2==0){
                buttons[ i].setName("x");
                buttons[ i].setIcon(x);
                buttons[ i].removeActionListener(this);
            }
            else{
                buttons[ i].setName("o");
                buttons[ i].setIcon(o);
            }
            buttons[ i].removeActionListener(this);
        }
    }
    turn++;
    checkWin();
}



私は(初心者ではありませんが)Javaがあまり得意ではないので、コード設計がいかに悪いかについてあまり教えてはいけません。

4

3 に答える 3

4

すべてのコンポーネントを GUI に追加するsetVisible(true) 前に呼び出しているため、すべてが表示されていません。これをしないでください。代わりに、すべてのコンポーネントが追加されたsetVisible(true) 後に呼び出します。

また

  • 多くの人が示唆しているように、null レイアウトを使用しないでください。代わりに、レイアウト マネージャーについて学び、使用してください。
  • うん、別の本を手に入れよう。
于 2012-11-07T17:33:58.463 に答える
1

問題の解決策は本当に非常に簡単です...

最初の 1 つはレイアウト マネージャーの欠如であり、もう 1 つは UI を表示する順序です (既に述べたように)。

ここに画像の説明を入力

public class SimpleTicTacToe {

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

    public SimpleTicTacToe() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new GamePane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class GamePane extends JPanel {

        public GamePane() {
            setLayout(new GridLayout(3, 3));
            for (int index = 0; index < 9; index++) {
                add(new JButton());
            }
        }

    }

}

時間をかけてJFC/Swing を使用した GUI の作成を読み、基本を理解してください。

于 2012-11-07T20:11:12.567 に答える
1

Eclipse GUI は、特定の非常に特殊な方法で描画されたボタンのみをレンダリングします。コードが別の方法で (たとえば、ループを使用して) 行う場合、Eclipse はそれを描画できません。

また、を使用しLayoutManager、次のようなことをしないでください.setLayout(null)

于 2012-11-07T17:27:33.560 に答える