Java 为什么setBounds()方法即使在将setLayout()设置为null后也不起作用?
通常setBounds()方法将被调用对象定位在指定的位置和指定的大小。对吗? 我创建了一个JFrame类,并演示了它在设置为setLayout(null)的按钮上的工作。 然后我创建了一个扩展JPanel的类,并在其中放置了一些组件。 这些组件的边界在方法内部设置。 此类的对象包含在扩展JFrame的类中。 然后该对象调用setBound()方法。 但是结果并没有显示JPanel扩展类中的组件。 cde片段如下所示Java 为什么setBounds()方法即使在将setLayout()设置为null后也不起作用?,java,swing,Java,Swing,通常setBounds()方法将被调用对象定位在指定的位置和指定的大小。对吗? 我创建了一个JFrame类,并演示了它在设置为setLayout(null)的按钮上的工作。 然后我创建了一个扩展JPanel的类,并在其中放置了一些组件。 这些组件的边界在方法内部设置。 此类的对象包含在扩展JFrame的类中。 然后该对象调用setBound()方法。 但是结果并没有显示JPanel扩展类中的组件。 cde片段如下所示 class Administrator extends JFrame impl
class Administrator extends JFrame implements ActionListener
{
public Administrator()
{
setTitle("Administration");
setSize(500,500);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(null);
JButton newbutton=new JButton(" New.. ");
newbutton.addActionListener(this);
add(newbutton);
newbutton.setBounds(100,100,100,25);
setVisible(true);
public static void main(String arg[])
{
new Administrator();
}
public void actionPerformed(ActionEvent ae)
{
String act=(String)ae.getActionCommand();
if(act.equals("New Registry..")||act.equals(" New.. "))
{
regPanel rgpnl=new regPanel();
Dimension sz;
sz=rgpnl.getPreferredSize();
rgpnl.setBounds(800,800,sz.width,sz.height);
rgpnl.arrangeComponents();
add(rgpnl);
repaint();
setVisible(true);
}
}
class regPanel extends JPanel
{
Label namelab;
JTextField name;
JButton do_register;
public regPanel()
{
//Container = get ();
setLayout(null);
namelab=new Label("Name :");
name=new JTextField(20);
add(namelab);
add(name);
add(do_register);
}
public void arrangeComponents()
{
Dimension size;
size=namelab.getPreferredSize();
namelab.setBounds(20,10,size.width,size.height);
name.getPreferredSize();
name.setBounds(150,10,size.width,size.height);
do_register.setBounds(10,10,size.width,size.height);
repaint();
}
}
除了代码中一些有问题的部分——比如缺少花括号、空指针和类似的错误——代码在(800800)处创建组件,而接口的大小只有500x500 px。这将使组件看不见。将组件放置在与窗口原点的较小偏移处,它们将显示出来。(我对此进行了测试,并对代码进行了一些修改,比如对
setLayout(null)
进行调用的顺序。此调用似乎应该在正确的时间进行,否则组件将不会为我显示。)这可能不是您想要听到的答案,但是你最好避免使用空布局和绝对定位,因为这可能是一个需要维护的负担,如果你的GUI运行在一个操作系统上,而不是在它开发的操作系统上,那么可能会让你的GUI变得丑陋或不可用。大多数GUI,甚至相当复杂的GUI,都可以通过使用简单布局管理器的JPanel嵌套来实现,或者禁用GridBagLayout或MIgLayout(不是标准Java的一部分,但在我上次使用它时是免费的,并且相当容易使用)。此外,如果您向我们展示了您试图实现的布局的图像,或对其进行了相当详细的描述,我们可以帮助您选择最佳的布局管理器组合,以便首先尝试。您缺少了几个}
,并在代码中导入,使其真正具有粘贴编译运行价值。