并非所有按钮都显示在Java中?

时间:2012-11-07 17:23:38

标签: java eclipse macos swing jbutton

当我使用eclipse运行我的程序时,只显示一个按钮(左上角)但是当我在终端中使用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。

3 个答案:

答案 0 :(得分:4)

在将所有组件添加到GUI之前,您正在调用setVisible(true) ,因此不会全部显示它们。不要这样做。而是在添加所有组件后调用setVisible(true)

另外

  • 正如许多人所建议的那样,不要使用null布局,而是要了解并使用布局管理器。
  • 是的,再拿一本书。

答案 1 :(得分:1)

Eclipse GUI仅呈现以某些非常具体的方式绘制的按钮。如果您的代码以不同方式执行(例如,使用循环),Eclipse将无法绘制它。

另外,使用LayoutManager,请勿执行.setLayout(null)

之类的操作

答案 2 :(得分:1)

问题的解决方案非常简单......

第一个是缺少布局管理器,另一个是显示UI的顺序(正如已经说明的那样)

enter image description here

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());
            }
        }

    }

}

花点时间阅读Creating a GUI With JFC/Swing以掌握基本知识。