3

Java Swingはスレッドセーフではないため、Java Swingをプログラミングするときは、これらのコンポーネントをJavaEventQueueに入れる必要があることを読みました。

しかし、を使用するEvent Queueと、コンポーネントのプロパティを更新する方法がわかりません(たとえば、ラベルのテキストを設定したり、何かを変更したりします)。これが私のコードです:

public class SwingExample {

    private JLabel lblLabel;    
    SwingExample(){
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

        lblLabel = new JLabel("Hello, world!", JLabel.CENTER);
        frame.getContentPane().add(lblLabel); // adds to CENTER
        frame.setSize(200, 150);
        frame.setVisible(true);

    }

    public void setLabel(){
        lblLabel.setText("Bye Bye !!!");
    }



    public static void main(String[] args) throws Exception
    {
        SwingExample example = null;
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                example = new SwingExample(); // ERROR : Cannot refer to non-final variable inside an inner class defined in different method
            }
        });

        // sometime in the futures, i want to update label, so i will call this method...
        example.setLabel();
    }

}

私が書いSwingExample example = new SwingExample();た場合、エラーは再び表示されないことは知っていますが、それを使用すると、example.setLabel後で処理することはできません。

このエラーとその修正方法について教えてください。

ありがとう :)

4

1 に答える 1

3

インスタンスをフィールドとして持つSwingExampleことで、内部クラス内でそれを参照することができますfinal

public class SwingExample {

    private JLabel lblLabel;    
    private static SwingExample instance;    

    SwingExample() {
        // code omitted
    }

    public void setLabel() {
        lblLabel.setText("Bye Bye !!!");
    }

    public static void main(String[] args) throws Exception {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                instance = new SwingExample();
            }
        });

        // ...

        EventQueue.invokeLater(new Runnable() {
            public void run() {
              instance.setLabel();
            }
        });
    }
}
于 2012-08-24T07:40:11.683 に答える