0

当我的程序导出视频时,我有这个加载面板向用户显示。因此,当单击导出按钮时,我会这样做:

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);

}
4

4 回答 4

2

你错过了这一行:

mainloadframe.pack();

还:

  • 确保LoadFrame()从 EDT 调用它。
  • 用于loadFrame()方法名称而不是LoadFrame().
于 2013-05-29T09:26:37.010 回答
2

Swing 使用单线程模型。这意味着与 UI 的交互(创建/修改)在单个线程中执行,称为事件调度线程。

使用RepaintManagerEDT 来安排重绘请求。如果有东西阻塞了 EDT,这些绘制请求(和其他事件)将不会被处理。

Swing 也不是线程安全的。这意味着您只能从上下文 EDT 中创建和修改 UI。

您遇到的问题是,您正在用一个耗时的过程阻塞 EDT,这意味着 EDT 在您的长时间运行的任务完成之前无法处理任何事件。

有许多解决方案。

你可以...

使用后台线程来执行耗时的操作。这导致了下一个问题,即如何告诉 UI 什么时候发生了变化(即,提供进度更新或流程已完成)。

您可以使用SwingUtilities.invokeLaterUI 重新同步更新。这会将 aRunnable放在 EDT 上,确保该run方法在 EDT 的上下文中执行。

你可以...

使用SwingWorker. ASwingWorker具有与 EDT 自动重新同步的方法,允许您在 EDT 内进行publish/process更改,以及done在其doInBackground方法完成后在 EDT 的上下文中执行的方法。

这可能是最简单的方法,因为它完全独立。

查看Swing 中的并发以获取更多详细信息

于 2013-05-29T23:56:01.367 回答
1
mainloadframe.add(loadpanel);

应该

mainloadframe.setContentPane(loadpanel);
于 2013-05-29T09:26:33.500 回答
0

mainloadframe.add(加载面板);

应该

mainloadframe.getContentPane(loadpanel);

于 2013-05-29T10:06:01.283 回答