为什么我的JFrame没有显示我的标签

时间:2013-05-29 09:23:48

标签: java swing user-interface jlabel

我有这个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);

}

4 个答案:

答案 0 :(得分:2)

你错过了这一行:

mainloadframe.pack();

此外:

  • 确保从EDT调用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方法。

你可以......

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

这可能是最简单的方法,因为它完全是自包含的。

查看Concurrency in Swing了解详情