gpt4 book ai didi

java - Swing 上的 EDT(傻瓜版)

转载 作者:行者123 更新时间:2023-12-02 07:11:20 33 4
gpt4 key购买 nike

所以,我只是在开发一个小游戏,除了 GUI 之外,它运行得很好。基本上,我需要在单击按钮时修改 GUI。我意识到我必须使用以下代码在 EDT 上运行我的代码:

EventQueue.invokeLater(new Runnable () {
@Override
public void run() {
// some code
}
});

我现在不知道我的代码的哪一部分与此有关。我创建 GUI 的部分(我的类的构造函数)?或者只有我修改值的部分(在这种情况下Listener.actionPerformed())?实际上我测试了这个机器人,但都不起作用。

现在我想知道的是如何修改以下代码以在单击按钮时更新按钮?我是否必须将其部分内容嵌入到上面的代码中,还是我完全错了?

package edttest;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class EDTtest {
public static void main(String[] args) {
GUI gui = new GUI ();
}

private static class GUI extends JFrame {

int x;

public GUI () {
x = 0;
setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
JButton button = new JButton (String.valueOf(x));
button.addActionListener(new Listener ());
JLabel label = new JLabel (String.valueOf(x));
add (label, BorderLayout.NORTH);
add (button);
pack();
setVisible (true);
}

private class Listener implements ActionListener {

@Override
public void actionPerformed(ActionEvent e) {
x++;
System.out.println (x);
}
}
}
}

最佳答案

无论您是否在 EDT 上执行此代码,都不会对您的标签产生任何影响。并不是因为您增加了 x 标签才会自行更新。您需要使用更新后的值调用 label#setText

关于您关于 EDT 的问题。 Swing 组件的所有访问/修改/创建/...都应该发生在 EDT 上。这意味着您应该将 main 方法的内容包装在 SwingUtilities#invoke... 中。通过 UI 触发的每个事件(例如单击按钮)都已在 EDT 上进行处理。因此,无需在监听器中的 EDT 上显式安排 Runnable

如有疑问,您可以随时使用 EventQueue#isDispatchThread 检查您是否处于 EDT。

我还建议阅读Concurrency in Swing教程

关于java - Swing 上的 EDT(傻瓜版),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15484370/

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