gpt4 book ai didi

java - 在不同的线程中使用 swing

转载 作者:行者123 更新时间:2023-12-03 13:09:14 24 4
gpt4 key购买 nike

我正在用 Java 开发一个基于 cli 的自定义网络爬虫。由于它需要一个用户友好的图形界面来显示结果,我应该在其中添加一个 Swing 框架,其中涉及一些树木、标签、表格等。
该图形界面是其开关之一,必须启动以防用户调用它。因此,我必须在新线程中启动此界面,以便应用程序可以继续执行其他任务并在需要时更新 GUI 框架内的组件。
我的 GUI 类是这样的:

public class Frame extends JFrame {
......
public static JLabel urlLabel;
......
public static void run() {
urlLabel = new JLabel();
urlLabel.setText("Test Url");
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Frame().setVisible(true);
}
});
}
.....
}

而且,我像这样从我的主类中 fork 它:
.....
if(cmd.gui){
Frame.run();
Frame.urlLabel.setText("New Url");
}
......

不幸的是,标签的文本没有改变。我已经测试过 repaint() , revalidate()以及诸如此类的其他功能,但是什么也没出现。
我测试了 getText()为了确保可以访问 urlLabel从主类,它工作(我可以检索标签的文本)。

我想知道如何解决这个问题? (基本上,我需要在不同的线程中启动一个swing frame,并从主线程控制它的组件)

提前致谢。

最佳答案

如果您使用 invokeLater() ,您的 Runnable 将在该线程中的当前操作完成后在 EventThread 中启动。如果您的标签未更新,则可能是您的 EventThread 正忙于做其他事情 - 例如。爬网。

你肯定需要确保你的爬取工作是在另一个线程中完成的(开始一个新的,不要使用仍然运行的那个,因为这很可能是 EventThread)。那么你可以使用 invokeLater()在此其他线程中更改 EventThread 中的标签。

提示:您可以使用 SwingUtilities.isEventDispatchThread() 来检查您是否在 EventThread 中。 .

请记住,您的数据/模型将被不同的线程使用,并且当您的工作线程中的数据在您的 GUI 尝试显示它时发生更改时,这可能会导致问题。

关于java - 在不同的线程中使用 swing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42221209/

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