gpt4 book ai didi

java - 为什么 sleep 方法会影响/不在面板上显示我更新的 JTextArea?

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

我有一个带有各种面板的窗口。在一个面板上,我有一个名为dogTalk 的JTextArea,我可以在其中更新其文本。用户单击按钮后,我希望文本添加我在 setText 中下面提到的内容。

我使用了 sleep 方法,以便用户可以阅读我更新的文本,并且窗口可以在 4 秒内自动关闭。(我不希望用户能够在关闭时关闭窗口,因此我没有使用 Jframe.EXIT_ON_CLOSE 而是使用 JFrame.DO_NOTHING_ON_CLOSE 并在 sleep 和 system.ext(0) 的帮助下使用我的自动关闭)

但是,我注意到 sleep 方法不允许dogTalk 更新。不过,它打印出“我们正在工作”,所以我猜这是窗口的问题?我知道是 sleep 导致了问题,而不是我的代码中的其他原因,因为当我注释掉 sleep 和 system.exit(0) 并测试我的 if 语句是否正在执行时,我注意到 JTextArea 确实用我的语句进行了更新!你能帮我一下吗?

if (e.getActionCommand().equals("buybone")) {

        System.out.println("We're working");
dogTalk.setText(dogTalk.getText() + "\nWow bone very wow much thanks bye.");
try
{
TimeUnit.SECONDS.sleep(4);
}
catch ( InterruptedException e1 )
{
// TODO Auto-generated catch block
e1.printStackTrace();
}

System.exit(0);

}

最佳答案

不要调用System.exit,而是让应用程序优雅地消失。当没有非守护线程仍然 Activity 时,应用程序终止。 Daemon 只是一个标志,用于确定 JVM 是否应在该线程仍在运行时终止;如果非守护线程正在运行,JVM 仍将终止。

话虽如此,问题是您在事件调度线程上调用 sleep

EDT 处理 Swing 和 AWT 组件的所有更新和呈现,并执行事件监听器中指定的行为(例如 ActionListener#actionPerformed(ActionEvent))。如果您导致它阻塞(通过 sleep 或其他形式的阻塞),它将无法处理更新和渲染。当您调用 setText 时,EDT 需要能够调整文本。您可以通过强制其 sleep 来防止这种情况发生。

如何修复

生成一个新线程,让它等待 4 秒,然后让它处理你的框架:

Java 8+

public void actionPerformed(ActionEvent e) {
dogTalk.setText(...);
new Thread(() -> {
TimeUnit.SECONDS.sleep(4);
frame.dispose();
}).start();
}

Java 8 之前

public void actionPerformed(ActionEvent e) {
dogTalk.setText(...);
new Thread(new Runnable() {
public void run() {
TimeUnit.SECONDS.sleep(4);
frame.dispose();
}
}).start();
}

关于java - 为什么 sleep 方法会影响/不在面板上显示我更新的 JTextArea?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30365467/

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