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はまだ無効になっています。ここで何が間違っていましたか?

EDIT : ここに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);
        }
    });

button1receiveCommandメソッドの両方がこのGameクラスにあります。

public class Game extends javax.swing.JFrame

メソッドは別のクラスから呼び出されます。

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

EDIT 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 に答える