小编典典

将setVisible()函数放置在函数的开头是否不同?

java

我是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()函数放置在方法的开头或结尾可能是什么问题。


阅读 284

收藏
2020-11-30

共1个答案

小编典典

正如评论和其他答案中已经指出的那样:

setVisible(true) 添加完所有组件后,您应该在最后致电。


这不会直接回答您的问题。您的问题的答案是: 是的,这有所作为 。如果您setVisible在添加所有组件之前进行调用,则在某些情况下,它
可能 适用于某些程序,某些PC,某些Java版本和某些操作系统,但是您 始终 必须期望它可能无法按预期方式工作某些情况下。

您可以在stackoverflow和其他地方找到许多相关问题。这些问题的通常症状是某些组件无法正确显示,然后在调整窗口大小时突然出现。(调整窗口大小基本上会触发布局和重新绘制)。


当您违反Swing的线程规则时,意外行为的可能性会增加。而且,从某种意义上讲,您确实违反了Swing的线程规则:您应该始终在事件调度线程上创建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从构造函数中调用它。这是真的。更重要的是:您通常
应该直接创建that的类extends JFrame。(在一些(罕见!)的情况下,这是合适的,但总的指导原则应该是 不能 延长JFrame

2020-11-30