为什么即使将setLayout()设置为null后setBounds()方法也不起作用?

时间:2010-12-20 15:39:12

标签: java swing

通常,setBounds()方法将被调用对象定位在指定的位置和指定的大小。 我创建了一个JFrame类,并演示了它在设置setLayout(null)的按钮上工作。 然后我创建了一个扩展JPanel并在其中放入一些组件的类。 这些组件的边界在方法中设置。 此类的对象包含在扩展JFrame的类中。 然后这个对象调用setBound()方法。 但结果并未显示JPanel扩展类中的组件。 cde片段如下所示。

class Administrator extends JFrame implements ActionListener
{
  public Administrator()
  {
    setTitle("Administration"); 
    setSize(500,500);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setLayout(null);    
    JButton newbutton=new JButton(" New.. ");
    newbutton.addActionListener(this);
    add(newbutton);
    newbutton.setBounds(100,100,100,25);
    setVisible(true);

    public static void main(String arg[])
    {
      new Administrator();
    } 

    public void actionPerformed(ActionEvent ae)
  {
    String act=(String)ae.getActionCommand();
    if(act.equals("New Registry..")||act.equals(" New.. "))
     {
        regPanel rgpnl=new regPanel();

        Dimension sz;
        sz=rgpnl.getPreferredSize(); 
        rgpnl.setBounds(800,800,sz.width,sz.height);       
        rgpnl.arrangeComponents();   
        add(rgpnl);


        repaint();
        setVisible(true);
     }
}
class regPanel extends JPanel 
{
  Label namelab;
  JTextField name;
  JButton do_register;
  public regPanel()
  {
    //Container   = get ();
    setLayout(null);

    namelab=new Label("Name :");
    name=new JTextField(20); 
    add(namelab); 
    add(name);
    add(do_register); 
   }
   public void arrangeComponents() 
  {
    Dimension size;

    size=namelab.getPreferredSize();
    namelab.setBounds(20,10,size.width,size.height);
    name.getPreferredSize();
    name.setBounds(150,10,size.width,size.height); 
    do_register.setBounds(10,10,size.width,size.height);

    repaint();

  }    
}     

2 个答案:

答案 0 :(得分:6)

除了代码的一些可疑部分 - 比如缺少大括号,空指针和此类错误 - 您的代码在(800,800)处创建组件,而界面的大小仅为500x500像素。这将使组件脱离视野。将组件放置在距窗口原点较小的偏移处,它们将显示。 (我测试了这个,以及对代码的一些修改,比如关于setLayout(null)进行调用的顺序。这个调用似乎应该在正确的时间发生,否则组件不会显示给我。 )

答案 1 :(得分:3)

这可能不是你想要听到的答案,但你最好避免使用空布局和绝对定位,因为它可能是一个需要维护的熊,并且可能会使你的GUI丑陋或无法使用操作系统不是它开发的操作系统。大多数GUI,甚至相当复杂的GUI都可以使用简单的布局管理器嵌套JPanel,或禁止GridBagLayout或MIgLayout(不是标准Java的一部分,但是我上次使用它时是免费的,并且相当容易使用)。此外,如果您向我们展示您正在尝试实现的布局图像,或者以相当好的细节描述它,我们可以帮助您指导最佳布局管理器组合,以便首先尝试。