放置在Runnable对象内部创建的框架的正确方法是什么?

当在LoadingRunnable完成其构造函数之前调用endDialog时,下面的代码返回一个空指针异常。
构造函数完成后,如何执行endDialog?

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class LoadingRunnable implements Runnable
{
    private JFrame jFrame;

    @Override
    public void run()
    {
        jFrame = new JFrame("Window");
        JPanel jPanel = new JPanel();
        JLabel label = new JLabel("Loading...");
        jPanel.add(label);
        jFrame.setContentPane(jPanel);
        jFrame.pack();
        jFrame.setVisible(true);
    }

    public void endDialog()
    {
        jFrame.setVisible(false);
        jFrame.dispose();
    }

    public static void main(String args[])
    {
        LoadingRunnable l = new LoadingRunnable();
        SwingUtilities.invokeLater(l);
        //work done here
        l.endDialog();
    }
};

最佳答案

您这里有一个并发问题,因为SwingUtilities.invokeLater()main线程流仍在运行时会异步地在Event Dispatch Thread中调度可运行类的执行,从而导致NPE。

布置框架的正确方法是通过事件,就像使用Swing一样。例如,通过单击“ X”(关闭)按钮或调度WindowEvent

frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));


您可能也想看看这个问题:Optional way to close a dialog window

此外

如果只想在应用程序启动过程中显示某些内容,则可以使用SplashScreen API代替JFrame。有关更多详细信息,请参见How to Create a Splash Screen



根据您的previous question和新版本,我建议您阅读整个Concurrency in Swing教程,以了解Swing中常见的并发问题以及如何处理它们。

07-26 09:30
查看更多