放置在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中常见的并发问题以及如何处理它们。