我正在我的代码中执行以下调用:
...
setLayout(null);
...
我正在尝试通过指定x和y坐标来放置按钮和文本字段。
运行程序时(使用Eclipse或BlueJ)的问题是我需要在面板上运行按钮和文本字段的位置,以便分别查看按钮和文本字段。
当我找到文本字段时,它很小。只有当我开始写作时才会假定我指定的大小。
有谁知道如何解决它?
答案 0 :(得分:7)
避免使用setLayout(null),除非你有充分的理由。您可以在此处了解布局管理器:http://docs.oracle.com/javase/tutorial/uiswing/layout/using.html
如果您仍想使用空布局,则必须设置组件的宽度和高度,而不仅仅是x和y位置(请参阅setSize方法)。
从上面提到的链接:
虽然我们强烈建议您使用布局管理器,但您可以 没有它们执行布局。通过设置容器的布局属性 为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);
}
});
}
}