我在我的代码中执行以下调用:
...
setLayout(null);
...
我试图通过指定它们的 x 和 y 坐标来放置一个按钮和一个文本字段。
当我运行程序(使用 Eclipse 或 BlueJ)时的问题是我需要在面板上运行到按钮和文本字段的位置,以便分别查看按钮和文本字段。
当我找到文本字段时,它很小。只有当我开始写作时,它才会采用我指定的大小。
有谁知道如何解决它?
我在我的代码中执行以下调用:
...
setLayout(null);
...
我试图通过指定它们的 x 和 y 坐标来放置一个按钮和一个文本字段。
当我运行程序(使用 Eclipse 或 BlueJ)时的问题是我需要在面板上运行到按钮和文本字段的位置,以便分别查看按钮和文本字段。
当我找到文本字段时,它很小。只有当我开始写作时,它才会采用我指定的大小。
有谁知道如何解决它?
避免 setLayout (null),除非你有很好的理由。您可以在这里了解布局管理器:http: //docs.oracle.com/javase/tutorial/uiswing/layout/using.html
如果您仍想使用 null 布局,则必须设置组件的宽度和高度,而不仅仅是其 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);
}
});
}
}