【问题标题】:EDT on Swing (for Dummies)EDT on Swing(傻瓜版)
【发布时间】:2013-03-18 18:39:44
【问题描述】:

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

【问题讨论】:

  • “如何修改下面的代码来更新Button” 用什么方式更新?
  • private static class GUI extends JFrame { 1) static 很少有帮助。 2)不要扩展框架,只使用一个实例。
  • @AndrewThompson 我不同意你的建议,他们俩。
  • @MouseEvent 对你有好处!

标签: java swing jlabel settext eventqueue


【解决方案1】:

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

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

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

我还建议阅读Concurrency in Swing 教程

【讨论】:

  • 感谢您的帮助!我在 EDT 上写了一个 increment()-method,它是从 ActionListener 调用的,并且还包装了整个构造函数。这解决了问题
猜你喜欢
  • 1970-01-01
  • 2011-10-12
  • 2010-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
  • 2010-11-13
相关资源
最近更新 更多