[英]Why does my JFrame not show my label
我的程序面板要在我的程序导出视频时显示给用户。 因此,当单击导出按钮时,我这样做:
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);
}
您错过了这一行:
mainloadframe.pack();
也:
LoadFrame()
。 loadFrame()
作为方法名称,而不是LoadFrame()
。 mainloadframe.add(loadpanel);
应该
mainloadframe.setContentPane(loadpanel);
mainloadframe.add(loadpanel);
应该
mainloadframe.getContentPane(loadpanel);
Swing使用单线程模型。 这意味着与UI的交互(创建/修改)是在单个线程(称为事件调度线程)中执行的。
RepaintManager
使用EDT计划重新绘制请求。 如果某些东西阻止了EDT,则这些绘画请求(以及其他事件)将不会被处理。
摆动也不是线程安全的。 这意味着只希望您在上下文EDT中创建和修改UI。
您遇到的问题是,您要花费很长时间来阻止EDT,这意味着EDT在长时间运行的任务完成之前无法处理任何事件。
有许多解决方案。
使用后台线程执行耗时的操作。 这导致了下一个问题,即当某些事情发生更改时(例如,提供进度更新或过程已完成),您如何告诉UI。
您可以使用SwingUtilities.invokeLater
与UI重新同步更新。 这会将Runnable
放置在EDT上,确保run
方法在EDT上下文中执行。
使用SwingWorker
。 SwingWorker
具有自动与EDT重新同步的方法,允许您在EDT中publish
/ process
更改,以及在doInBackground
方法完成后在EDT上下文中执行的done
方法。
这可能是方法中最简单的,因为它们都是自包含的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.