0

在我的主 Swing 框架中,我有这个方法:

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 )。

但是这不起作用,即button1仍然被禁用。我在这里做错了什么?

编辑:这是button1的声明:

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);
        }
    });

button1和receiveCommand方法都在这个Game类中:

public class Game extends javax.swing.JFrame

该方法是从另一个类调用的:

gameUI.receiveCommand("enable"); //gameUI is a Game object

编辑 2:感谢您的所有帮助!毕竟这是一个错误的参考,所以我所做的只是尝试更新尚未设置为可见的错误框架的 GUI。傻我

4

1 回答 1

1

所以无论如何,这行得通。

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);
        }
    }
}
于 2012-11-08T06:20:55.013 回答