我有这个loadpanel,以便在我的程序导出视频时向用户显示。因此,当单击导出按钮时,我这样做:
loadframe = new LoadFrame("Video Exporteren...");
这将创建对话框并在屏幕上显示。然而,在显示对话框上的实际标签之前大约需要5秒钟。谁能告诉我为什么。 感谢
public LoadFrame(String operation) {
mainloadframe = new JDialog();
JLabel operationlabel = new JLabel(operation);
loadpanel = new JPanel();
mainloadframe.setSize(300, 75);
mainloadframe.setLocationRelativeTo(null);
mainloadframe.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
mainloadframe.setAlwaysOnTop(true);
mainloadframe.setTitle(operation);
mainloadframe.setResizable(false);
loadpanel.add(operationlabel);
mainloadframe.add(loadpanel);
mainloadframe.setVisible(true);
}
答案 0 :(得分:2)
你错过了这一行:
mainloadframe.pack();
此外:
LoadFrame()
。loadFrame()
代替方法名称而不是LoadFrame()
。答案 1 :(得分:1)
mainloadframe.add(loadpanel);
应该是
mainloadframe.setContentPane(loadpanel);
答案 2 :(得分:1)
mainloadframe.add(loadpanel);
应该是
mainloadframe.getContentPane(loadpanel);
答案 3 :(得分:1)
Swing使用单线程模型。这意味着与UI的交互(创建/修改)在单个线程中执行,称为事件调度线程。
RepaintManager
使用EDT安排重绘请求。如果某些内容阻止了EDT,则不会处理这些绘制请求(和其他事件)。
Swing也不是线程安全的。这意味着您只能在上下文EDT中创建和修改UI。
您遇到的问题是,您是否正在使用耗时的过程来阻止EDT,这意味着在您的长期任务完成之前,EDT无法处理任何事件。
有许多解决方案。
使用后台线程执行耗时的操作。这导致了下一个问题,即如何在某些内容发生变化时告知用户界面(即提供进度更新或该过程已完成)。
您可以使用SwingUtilities.invokeLater
与UI重新同步更新。这将Runnable
置于EDT上,确保在EDT的上下文中执行run
方法。
使用SwingWorker
。 SwingWorker
有自动与EDT重新同步的方法,允许您在EDT中进行publish
/ process
更改,以及在上下文中执行的done
方法其doInBackground
方法完成后的EDT。
这可能是最简单的方法,因为它完全是自包含的。
查看Concurrency in Swing了解详情