Java – setVisible(true)对GUI没有影响

我使用Netbeans GUI Builder创建了一个GUI(称为ParameterUI),现在我想创建它的一个实例并显示它。 但是,使用

ParameterUI gui = new ParameterUI(); gui.setVisible(true); 

不会导致出现任何窗口…测试表明,在这些命令之后,gui.isVisible()返回true,但gui.isValid()为false。 调用gui.revalidate()也没有效果。

在ParameterUI类中,构造函数方法由Netbeans生成,并且很简单

 public class ParameterUI extends javax.swing.JPanel { public ParameterUI() { initComponents(); } } 

initComponents只是列出每个jPanel等的位置。

奇怪的是,当我使用http://netbeans.org/kb/docs/java/gui-functionality.html上的教程进行练习GUI时,尽管没有主要的方法,但GUI被设置为主类。 GUI自动出现。

不幸的是我是GUI的新手(我正在使用构建器,因为我没有时间学习如何制作一个合适的手工制作的GUI),但有人可以告诉我如何让我的GUI可见吗? 如有必要,我可以提供更多代码……

编辑:我试过了

 JFrame window = new JFrame(); ParameterUI gui = new ParameterUI(); window.setContentPane(gui); window.pack(); window.setVisible(true); 

阅读了关于JFrames的简短教程,但它似乎没有改变任何东西……

您使用的是JFrame还是使用Netbeans创建了桌面应用程序? 因为如果你创建了一个桌面应用程序,Netbeans有它自己的类,我也有很多问题…因此,我建议你使用JFrame。 如何,您可以尝试这样看看UI是否启动:

 SwingUtilities.invokeLater(new Runnable() { public void run() { ParameterUI gui = new ParameterUI(); gui.setVisible(true); } }); 

由于您要扩展JPanel,因此需要将面板放在JFrame上才能看到。 要做到这一点,在netbeans中,只需创建一个新的JFrame(右键单击该包并选择“New JFrame”。现在,返回到您的面板,在左边缘(在Project,Files等下)你应该有一个项目命名为“Inspector”单击它,您应该看到组件的树视图。右键单击要显示的JPanels并选择“Copy”。返回刚刚创建的JFrame,找到“Inspector”按钮从左边距,单击它,在顶部你应该有一个名为“[JFrame]”的项目。右键单击该项目并选择粘贴。现在您应该看到您创建的面板。

要查看面板,只需输入JFrame的名称而不是ParameterUI

组件上的setVisible()在该组件中设置一个标志(此时你还不关心其他事情)。 此标志由包含组件的容器检查,以查看是否需要显示该组件。

窗口上的setVisible()控制窗口是否显示在屏幕上。 现在,它所做的就是让你的窗口显示或消失。 通常,您希望在使其可见之前给它一些大小和位置。 pack()setLocationRelativeTo()在这里很有用。

因此,要查看您的gui, ParameterUI必须扩展Window (可能是JFrameJDialog ),或者它必须包含在窗口中,您应该在窗口而不是ParameterUI实例上调用setVisible(true) 。 这样做的一个简单示例是(未经测试):

 // expected to be called on the AWT/Event Dispatch Thread public void show(ParameterUI ui) { JFrame frame = new JFrame(); frame.setLayout(new BorderLayout()); frame.add(ui, BorderLayout.CENTER); frame.pack(); frame.setLocationRelativeTo(null); // position in the center of the screen frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frame.setVisible(true); }