我试图用按钮显示一个计算器,但唯一显示的是一个空的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();
}
}
Run Code Online (Sandbox Code Playgroud)
添加所有组件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);
}
Run Code Online (Sandbox Code Playgroud)
为了进一步理解,如果要在ActionListener中添加组件,可以调用revalidate()并repaint()在添加组件后,这也将更新GUI.(不要再打电话setVisible(true))