我只是Java GUI编程的新手,当我将setVisible()
函数放在构造函数调用的函数的开头但是它工作时,我遇到的问题是我的面板中的组件丢失了当它结束时很好。请参阅以下代码:
public static void main(String[] args)
{
new MainClass();
}
public MainClass()
{
setFrame();
}
private void setFrame()
{
JFrame frame = new JFrame();
frame.setSize(400,400);
frame.setResizable(false);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Some area where the object of my components inside the panel is created and initialized.
// If I just place a label and a button, it will appear on the panel. However if I add the JTextArea, all the components in my panel is gone. Just like the code below.
textArea1 = new JTextArea(20,34);
textArea1.setWrapStyleWord(true);
textArea1.setLineWrap(true);
JScrollPane scroll =
new JScrollPane(textArea1,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
panel.add(scroll);
frame.add(panel);
// Works fine when setVisible(true); it placed here.
}
关于将setVisible()
函数放置到方法的开头或结尾可能会出现什么问题。
答案 0 :(得分:5)
正如评论和其他答案中已经指出的那样:
在添加完所有组件后,您应该在结尾处致电setVisible(true)
。
这并不直接回答您的问题。您的问题的答案是:是的,它会产生影响。如果在添加所有组件之前调用setVisible
,可能在某些情况下使用某些程序,在某些PC上,某些Java版本,以及某些操作系统 - 但是你始终必须指望它在某些情况下可能无法正常工作。
您将在stackoverflow和其他地方找到许多相关问题。这些问题的常见症状是某些组件未正确显示,然后在调整窗口大小时突然出现。 (调整窗口大小基本上会触发布局和重新绘制)。
违反Swing的线程规则时,意外行为的可能性会增加。而且,从某种意义上说,你确实违反了Swing的线程规则:你应该总是在Event Dispatch Thread上创建GUI!
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class SomeSwingGUI
{
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
createAndShowGUI();
}
});
}
// This method may (and will) only be called
// on the Event Dispatch Thread
private static void createAndShowGUI()
{
JFrame f = new JFrame();
// Add your components here
f.setVisible(true); // Do this last
}
}
顺便说一句:Timothy Truckle在评论中指出你不应该从构造函数中调用setVisible
。这是真的。更重要的是:您通常不直接创建extends JFrame
的类。 (在某些(罕见!)情况下,这是合适的,但一般指南应该是不扩展JFrame
)
答案 1 :(得分:2)
无法显示组件,因为在调用Frame的setVisible()方法后添加它们。
Componet的 add()方法更改了与布局相关的信息,并使组件层次结构无效。如果已显示容器,则必须在此后验证层次结构,以便显示添加的组件,如指向here
因此,为了显示项目,您应该调用框架的revalidate()方法,或者在添加所有组件后调用setVisible()。
除非没有特殊需要,否则在添加其他所有组件后应调用setVisible()。
public class TestMain extends JFrame {
public static void main(String[] args) {
JFrame test = new TestMain();
//if the setVisible() is called too early, you have to revalidate
test.revalidate();
}
public TestMain() {
setFrame();
}
private void setFrame() {
setSize(400,400);
setResizable(false);
setLayout(new FlowLayout());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel(new FlowLayout());
setVisible(true);
JTextArea textArea1 = new JTextArea(25,15);
textArea1.setWrapStyleWord(true);
textArea1.setLineWrap(true);
panel.add(textArea1);
JScrollPane scroll =
new JScrollPane(panel,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
// this method invalidates the component hierarchy.
getContentPane().add(scroll);
}
}