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

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

... setLayout(null); ... 

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

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

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

有谁知道如何解决它?

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

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

从上面提到的链接:

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

我建议使用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); } }); } }