0

所以,我只是在做一个小游戏,除了 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);
            }
        }
    }
}
4

1 回答 1

2

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

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

如有疑问,您可以随时使用 . 检查您是否在 EDT 上EventQueue#isDispatchThread

我还建议阅读Swing 中的并发教程

于 2013-03-18T18:44:45.793 回答