问题描述:
    我用GridBagLayout进行布局,添加了组件运行时,只显示框架,却没显示组件(组件未添加成功)。源程序如下,跪求大虾相助丶小弟不胜感激···
package AddressBook;
import javax.swing.*;
import java.awt.*; 
import java.awt.event.*;
class LoginInterface extends JPanel
{
public final int WIDTH = 350;
public final int HEIGHT = 250;

//该方法用于将控件添加到容器中
public void add(Component c,GridBagConstraints gbc,int x,int y,int w,int h)
{
gbc.gridx = x;
gbc.gridy = y;
gbc.gridwidth = w;
gbc.gridheight = h;
add(c,gbc);
}

LoginInterface()
{
JFrame li = new JFrame();
li.setTitle("通讯录");//设置标题
li.setLayout(new GridBagLayout());

//以下几行创建按钮、标签、文本框
JButton login = new JButton("登录");
JButton exit = new JButton("退出");
JLabel zhanghao = new JLabel("账号");
JLabel mima = new JLabel("密码");
JLabel note = new JLabel("请输入您的名字,如:zhaoshuaihua");//注释标签
JTextField user = new JTextField(15);
JTextField password = new JTextField(15);
JPanel photo = new JPanel();

GridBagConstraints gbc = new GridBagConstraints();//创建约束对象
gbc.fill = GridBagConstraints.NONE ;
gbc.anchor = GridBagConstraints.CENTER ;
gbc.weightx = 3;
gbc.weighty = 4;

add(login,gbc,1,3,1,1);
add(exit,gbc,3,3,1,1);
add(zhanghao,gbc,0,0,1,1);
add(mima,gbc,0,2,1,1);
add(note,gbc,1,1,2,1);
add(user,gbc,1,0,2,1);
add(password,gbc,1,2,2,1);
add(photo,gbc,3,0,1,3);
li.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();   //***************
int x = (d.width - WIDTH)/2;                                 //设置登录窗口
int y = (d.height - HEIGHT)/2;                               //使在屏幕中央显示
li.setBounds(x,y,WIDTH,HEIGHT);                              //***************
li.setVisible(true);
}
public static void main(String[] args)
{
LoginInterface li = new LoginInterface();
}

}
谢谢了~

解决方案 »

  1.   

    只要改一句话
    li.setLayout(new GridBagLayout());改成:
    setLayout(new GridBagLayout());
    li.setContentPane(this);为什么呢?
    因为你要给一个JFrame添加组件,应该在其容器面板上添加
    而不似乎直接给JFrame去add
    你的 li 是JFrame,你设置它的Layout有什么用?
    应该给这个JFrame的容器面板设置Layout
    而你的这个类继承自一个JPanel,你的本意应该是用其作为JFrame的容器面板
    所以改成上面那样就可以了
      

  2.   

    你的LoginInterface的实例li没有添加容器,你要显示组件,需要相应的容器来承载这些组件,
    在:
            li.setTitle("通讯录");//设置标题        li.setLayout(new GridBagLayout());
    之间添加语句:li.add(this);
    就可以运行显示了
    .....已调试过.....
      

  3.   

    哦对了还需将语句:li.setLayout(new GridBagLayout());
    改为:setLayout(new GridBagLayout());
      

  4.   

    嗯呐丶可以了丶谢谢大家了···O(∩_∩)O~
    同#1楼大哥的差不多,之前我也曾只加过
    li.add(this); 
    不过因为其他的原因没成功。
    这还是由于没有设置中间容器的原因啊,只有一个顶层容器是无法将基本组件添加进去的...而且#3楼这句话很到位,改之后就显示正常了,只是还不太懂:
    "li.setLayout(new GridBagLayout());"

    "setLayout(new GridBagLayout());"
    在这里有什么区别啊?
      

  5.   

    li.setLayout(new GridBagLayout());
    设置的是你的JFrame的布局,
    而不是设置的JFrame的容器面板的的布局而setLayout(new GridBagLayout());
    设置的是你当前类,即你这个继承了JPanel的LoginInterface类的布局
    你真正要作为容器面板的是这个JPanel
    所以要设置这个JPanel的布局