0

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

...
setLayout(null);
...

我试图通过指定它们的 x 和 y 坐标来放置一个按钮和一个文本字段。

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

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

有谁知道如何解决它?

4

2 回答 2

7
  1. 避免 setLayout (null),除非你有很好的理由。您可以在这里了解布局管理器:http: //docs.oracle.com/javase/tutorial/uiswing/layout/using.html

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

从上面提到的链接:

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

于 2012-09-06T21:43:39.753 回答
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);
            }
        });
    }
}
于 2012-09-06T21:54:32.047 回答