繁体   English   中英

为什么我的JFrame不显示我的标签

[英]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();

也:

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

这可能是方法中最简单的,因为它们都是自包含的。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM