使用“setlayout(null)”时,窗口小部件表现得很奇怪

时间:2012-09-06 21:36:24

标签: java swing layout awt null-layout-manager

我正在我的代码中执行以下调用:

...
setLayout(null);
...

我正在尝试通过指定x和y坐标来放置按钮和文本字段。

运行程序时(使用Eclipse或BlueJ)的问题是我需要在面板上运行按钮和文本字段的位置,以便分别查看按钮和文本字段。

当我找到文本字段时,它很小。只有当我开始写作时才会假定我指定的大小。

有谁知道如何解决它?

2 个答案:

答案 0 :(得分:7)

  1. 避免使用setLayout(null),除非你有充分的理由。您可以在此处了解布局管理器:http://docs.oracle.com/javase/tutorial/uiswing/layout/using.html

  2. 如果您仍想使用空布局,则必须设置组件的宽度和高度,而不仅仅是x和y位置(请参阅setSize方法)。

  3. 从上面提到的链接:

      

    虽然我们强烈建议您使用布局管理器,但您可以   没有它们执行布局。通过设置容器的布局属性   为null,您使容器不使用布局管理器。有了这个   策略,称为绝对定位,你必须指定大小和   该容器中每个组件的位置。一个缺点   绝对定位是指当它调整不好时   顶级容器已调整大小。它也不适应   用户和系统之间的差异,例如不同的字体大小   和语言环境。

答案 1 :(得分:3)

我建议使用setBounds方法而不是setLocation

    JTextField tf = new JTextField(10);
    Dimension d = tf.getPreferredSize();
    tf.setBounds(x, y, d.width, d.height);

当然,如果您使用的是null布局管理器,则还需要处理preferredSize。这是一个包含所有主要方面的例子:

import java.awt.*;
import javax.swing.*;

public class TestProject extends JPanel{

    public TestProject(){
        super(null);

        JTextField tf = new JTextField(10);
        add(tf);

        Dimension d = tf.getPreferredSize();        
        tf.setBounds(10, 20, d.width, d.height);

    }

    @Override
    public Dimension getPreferredSize(){
        //Hard coded preferred size - but you'd probably want 
        //to calculate it based on the panel's content 
        return new Dimension(500, 300);
    }

    public static void main(String args[])
    {


        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
                frame.setContentPane(new TestProject());    
                frame.pack();
                frame.setVisible(true);
            }
        });
    }
}