这段代码运行得非常好。但是当我放置setSize(700,700)
并运行代码时,它不会向我显示JButtons而只显示框架。我认为JButtons的网格布局可能存在一些问题,所以我将每个gridlayout的最后两个条目更改为GridLayout(3,1,300,300)
。但是,结果是相同的(即没有JButton可见)。为什么会这样?
import java.awt.*;
import javax.swing.*;
public class Calculator extends JFrame
{
JButton jb[]=new JButton[12];
public Calculator(String title)
{
super(title);
Container c;
c=getContentPane();
setSize(100,100);
setVisible(true);
Panel p1=new Panel();
for(int h=0;h<9;h++)
{jb[h]=new JButton(""+(h+1));}
jb[9]=new JButton("=");
jb[10]=new JButton(".");
jb[11]=new JButton("0");
p1.setLayout(new GridLayout(4,3,3,3));
for(int h=0;h<12;h++){p1.add(jb[h]);}
Panel p2=new Panel(new GridLayout(3,1,3,3));
JButton jb1[]=new JButton[3];
jb1[0]=new JButton("+");
jb1[1]=new JButton("-");
jb1[2]=new JButton("*");
for(int i=0;i<3;i++){
p2.add(jb1[i]);}
Panel p4=new Panel(new GridLayout(3,1,3,3));
JButton jb4[]=new JButton[3];
jb4[0]=new JButton("%");
jb4[1]=new JButton("/");
jb4[2]=new JButton("-");
for(int i=0;i<3;i++){
p4.add(jb4[i]);}
Panel p3=new Panel();
JLabel jl0=new JLabel("INPUT:");
TextField tf=new TextField(30);
p3.add(tf);
p3.add(jl0);
jl0.setLayout(new FlowLayout(FlowLayout.LEFT));
c.add(BorderLayout.CENTER,p1);
c.add(BorderLayout.EAST,p2);
c.add(BorderLayout.WEST,p4);
c.add(BorderLayout.NORTH,p3);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main(String args[])
{new Calculator("Lets calculate ! :)");}
}
答案 0 :(得分:2)
您正在使用setSize(100, 100);
创建一个非常小的窗口。相反,在构造函数的末尾使用pack();
以使框架适合您的面板。
答案 1 :(得分:1)
您必须在方法的末尾设置setVisible(true)(添加按钮后)。
答案 2 :(得分:1)
因为setSize()
使组件层次结构无效,ref:http://docs.oracle.com/javase/7/docs/api/java/awt/Component.html#setSize%28int,%20int%29
您需要重新验证它。
为此,您最后可以再次致电revalidate();
甚至setVisible(true)
。
最好先调用pack();
,然后调用setVisible(true);
,而不是在向jframe添加任何组件之前调用setVisible()
。