gpt4 book ai didi

java - 如何从长方法中更新 swing GUI?

转载 作者:行者123 更新时间:2023-12-03 20:51:55 27 4
gpt4 key购买 nike

我是 Swing 的新手,目前正尝试在 NetBeans 中开发一个简单的 GUI 应用程序。

我想创建某种 GUI 日志系统,将应用程序正在执行的当前操作写入 TextArea。

作为一个简单的示例,我创建了一个仅包含 2 个对象的 JFrame 表单:一个“开始”按钮和一个 TextArea。

当按下“开始”按钮时,它会调用某种冗长的方法,该方法需要一些时间(比如 10 秒)才能完成运行,并且在该方法运行时,我想将文本附加到 TextArea从这个冗长的方法(当然我希望 TextArea 立即更新)。

我的问题是我找不到这样做的正确方法。无论如何,我尝试这样做,当我按下“开始”按钮时,应用程序卡住了 10 秒钟,没有像我想要的那样更新 TextArea。只有当该方法完成时,我才能看到对 TextArea 的更新。

这是一个示例代码:

private void startButtonActionPerformed(java.awt.event.ActionEvent evt) {
try {
for (int i = 0; i < 10; i++) {
textArea.setText(i + "\n");
Thread.sleep(1000);
}
} catch (Exception e) {}
}

在这个例子中,我希望看到的是,一旦我点击按钮,在接下来的 10 秒内,一个新行将每秒附加到 TextArea,如下所示:

1

2

3

4

...

但是我从这段代码中得到的真实结果是应用程序卡住了 10 秒,最后 TextArea 被更新并只显示数字 9。

我已经尝试了很多不同的方法来正确地做到这一点,主要是使用 SwingUtilities.invokeLaterSwingWorker 方法,但它们都不适合我。

如果您能帮助找到正确的方法,我们将不胜感激。

最佳答案

1.始终保持 UI 在 UI 线程上工作,Non-UI 在 Non-UI 线程上工作。

2. 在 Java GUI 应用程序中,main() 方法不会长期存在,在 >Event Dispatcher Thread,main() 方法退出...现在 EDT 负责处理 GUI。

3. 始终保留您的 EDT 线程,这是 GUI 线程,仅用于 GUI 工作。

例如:

public static void main(String[] args){


EventQueue.invokeLater(new Runnable(){

public void run(){

myframe.setVisible(true);

}

}

}

4. 创建一个单独的非 UI 线程来处理那个耗时较长的方法。

5.你可以简单地使用一个Thread或者使用Java中专门引入的SwingWorker同步UI和Non -UI线程。

关于java - 如何从长方法中更新 swing GUI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11817688/

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