我应该在 EDT 中创建 swing 元素吗?
我在编辑非线程安全图形元素时遇到了并发问题,但我正在创建它们,但它们尚未显示,如果它们很多或需要一些时间来分配,这会冻结 GUI,但不会是吗?
下面是我使用 EDT 来显示但不创建 GUI 结构的示例:
public class Launcher {
private final SwingWorker worker;
private final JFrame frame;
private final JLabel label;
private final JProgressBar progressBar;
public Launcher() {
// init user interface
frame = new JFrame();
JPanel panel = new JPanel(new BorderLayout());
label = new JLabel("Launching...", SwingConstants.CENTER);
progressBar = new JProgressBar(0, 100);
progressBar.setIndeterminate(true);
panel.add(label, BorderLayout.CENTER);
panel.add(progressBar, BorderLayout.PAGE_END);
initUI(panel);
worker = new LauncherWorker(this);
worker.addPropertyChangeListener((PropertyChangeListener)this);
}
private void initUI(final Component panel) {
if (!SwingUtilities.isEventDispatchThread()) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
DirectaChatLauncher.this.initUI(panel);
} //run()
});
return;
}
Container contentPane = frame.getContentPane();
contentPane.setLayout(new BorderLayout());
contentPane.add(panel, BorderLayout.PAGE_END);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("progress".equals(evt.getPropertyName())) {
int progress = (Integer) evt.getNewValue();
progressBar.setValue(progress);
}
}
private void setProgression(final String msg) {
label.setText(msg);
}
class LauncherWorker extends SwingWorker<Boolean, String> {
private final Launcher LAUNCHER;
public LauncherWorker(Launcher launcher) {
super();
LAUNCHER = launcher;
}
@Override
protected Boolean doInBackground() throws Exception {
setProgress(0);
publish("Started");
...
setProgress(100);
publish("Launched");
Thread.sleep(1000);
return Boolean.TRUE;
}
@Override
protected void process(List<String> chunks) {
LAUNCHER.setProgression(chunks.get(0));
}
@Override
public void done() {
LAUNCHER.done();
}
}
}
由于元素尚未显示,可以吗?或者我应该全部搬进initUI()
?
在秋千上可分离的模型架构 http://www.oracle.com/technetwork/java/architecture-142923.html#separable,视图组件监听其模型。由于视图可能会任意响应模型更新生成的事件,因此相应的模型必须also将在 EDT 上更新。您可以通过以下两种基本方法之一来减少延迟:
Use EventQueue.invokeLater() https://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html来自单独的线程,如图所示here https://stackoverflow.com/a/7519403/230513.
Use SwingWorker https://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html获得所列举的额外好处here https://stackoverflow.com/a/25526869/230513.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)