Java Swing invokeLater()方法不工作

Java Swing invokeLater()方法不工作,java,swing,netbeans,Java,Swing,Netbeans,在我的主摆动框架中,我有以下方法: public void receiveCommand(String command) { if (command.equals("enable")) { Runnable enable = new Runnable() { public void run() { button1.setEnabled(true);

在我的主摆动框架中,我有以下方法:

public void receiveCommand(String command) {
    if (command.equals("enable")) {
        Runnable enable = new Runnable() {
            public void run() {
                button1.setEnabled(true);                    
                button1.revalidate();
                button1.repaint();
            }                
        };
        SwingUtilities.invokeLater(enable);            
    }
基本上,我试图通过调用receiveCommand()方法从外部更新GUI(启用按钮button1

但是,这不起作用,即按钮1仍处于禁用状态。我做错了什么

编辑: 以下是按钮1的声明:

private javax.swing.JButton button1;
button1.setFont(new java.awt.Font("Tahoma", 0, 24)); // NOI18N
button1.setEnabled(false);
button1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
            button1ActionPerformed(evt);
        }
    });
按钮1receiveCommand方法都在这个游戏类中:

public class Game extends javax.swing.JFrame
该方法是从另一个类调用的:

gameUI.receiveCommand("enable"); //gameUI is a Game object
编辑2:感谢您的帮助!结果证明它毕竟是一个错误的引用,所以我所做的只是试图更新一个错误框架的GUI,该框架尚未设置为可见。愚蠢的我

所以不管怎样,这是有效的

public class TestInvokeLater {

    public static void main(String[] args) {
        new TestInvokeLater();
    }

    public TestInvokeLater() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setBorder(new EmptyBorder(12, 12, 12, 12));
            final JButton runMe = new JButton("Run me");
            runMe.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    runMe.setEnabled(false);
                    new Thread(new Runnable() {

                        @Override
                        public void run() {
                            try {
                                Thread.sleep(1000);
                            } catch (InterruptedException ex) {
                            }
                            SwingUtilities.invokeLater(new Runnable() {

                                @Override
                                public void run() {
                                    runMe.setEnabled(true);
                                }
                            });
                        }
                    }).start();
                }
            });
            setLayout(new GridBagLayout());
            add(runMe);
        }
    }
}

“不起作用”告诉我们的很少。你能详细说明一下吗?请提供更多信息以继续?是否确定正在执行
if
语句中的代码块?也许可以尝试使用
命令。equalsIgnoreCase(“启用”)
替代?我忘了添加:按钮1仍然是disabled@MadProgrammer我敢肯定它在ifAll中,我可以非常自信地说:问题不在您显示的代码中。我看到的唯一错误是不必要的重新验证和重新绘制调用。据我们所知,您可能在错误的引用上调用了
setEnabled(…)
,但同样,您没有向我们显示任何允许我们提供帮助的内容。为什么要尝试使其容器无效并重新绘制?应该没有必要调用这些方法中的任何一个。@Robin我同意,但我见过很多情况下,通过这样做“这不应该需要做”可以解决,但您的示例不是那种奇怪的情况。。。因此,杂乱无章可能会把没有经验的人引向错误的方向