为什么我的GUI没有显示任何内容?

时间:2015-09-07 20:10:57

标签: java swing

我正在尝试使用按钮显示计算器,但唯一显示的是空JFrame。

我能想到的唯一一件事是因为我在构造函数中完成了所有工作,并且我的主要只创建了对象而没有做任何其他事情。但是,如果是这种情况,为什么它仍然会显示一个空的GUI而不是什么?或者我只是完全错了?

    import java.awt.GridLayout;
import java.awt.TextField;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;

public class MyFrame extends JFrame{

    private GridLayout grid;
    private final String ADD = "+";
    private final String SUB = "-";
    private final String MULT = "*";
    private final String DIV = "/";
    private final String CLR = "C";
    private final String EQ = "=";

    private TextField textOnScreen;

    private final String[] buttonValues= {
            "7", "8", "9", ADD, 
            "4", "5", "6", SUB, 
            "1", "2", "3", MULT,
            "0", CLR, EQ, DIV
    };

    MyFrame(){

        super("Calculator");
        JPanel p = new JPanel();
        grid = new GridLayout(4, 4, 3, 3);//row, col, hor gap, vert gap
        p.setLayout(grid);
        setSize(400, 500);
        setResizable(true);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        //create buttons
        for(int i = 0; i < buttonValues.length; i++){
            p.add(new JButton(buttonValues[i]));
        }
        add(p);
    }

    public static void main(String[] args){

        MyFrame f = new MyFrame();

    }
}

1 个答案:

答案 0 :(得分:7)

在添加所有组件后调用setVisible(true)

MyFrame(){

    super("Calculator");
    JPanel p = new JPanel();
    grid = new GridLayout(4, 4, 3, 3);//row, col, hor gap, vert gap
    p.setLayout(grid);
    setSize(400, 500);
    setResizable(true);
    setDefaultCloseOperation(EXIT_ON_CLOSE);

    //create buttons
    for(int i = 0; i < buttonValues.length; i++){
        p.add(new JButton(buttonValues[i]));
    }
    add(p);

    setVisible(true);

}

为了进一步理解,如果要在ActionListener中添加组件,可以在添加组件后调用revalidate()repaint(),这也将更新GUI。 (不要再打电话给setVisible(true)