gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:23:32 25 4
gpt4 key购买 nike

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

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

}

最佳答案

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

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

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

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

有多种解决方案。

你可以...

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

您可以使用 SwingUtilities.invokeLater 与 UI 重新同步更新。这会将 Runnable 放置到 EDT 上,确保 run 方法在 EDT 的上下文中执行。

你可以...

使用SwingWorkerSwingWorker 具有自动与 EDT 重新同步的方法,允许您在 EDT 和 发布/处理更改did 方法,在其 doInBackground 方法完成后在 EDT 上下文中执行。

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

查看Concurrency in Swing了解更多详情

关于java - 为什么我的 JFrame 不显示我的标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16810121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com