1

これは非常に単純な問題のように思えますが、対処方法を理解するのに苦労しています。

サンプル シナリオ:

    final int number = 0;

    JFrame frame = new JFrame();
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    frame.setSize(400, 400); 

    final JTextArea text = new JTextArea();
    frame.add(text, BorderLayout.NORTH);

    JButton button = new JButton(number + ""); 
    button.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent arg0) { 
        number++; // Error is on this line
        text.setText(number + "");
    }});
    frame.add(button, BorderLayout.SOUTH);

私は本当にどこに行けばいいのかわからない。

4

2 に答える 2

5

final として宣言した場合number、その値を変更することはできません。修飾子を削除する必要がありfinalます。

次に、次の方法でその変数にアクセスできます。

public class Scenario {
    private int number;

    public Scenario() {
        JButton button = new JButton(number + "");
        button.addActionListener(new ActionListener() { 
            public void actionPerformed(ActionEvent arg0) { 
                Scenario.this.number++;
                text.setText(Scenario.this.number + "");
            }
        });
    }
}

「ClassName.this」という表記により、現在いるクラスのオブジェクトにアクセスできます。

number を最初に使用する場合は注意してください。--、new JButton(number)number に直接アクセスできます。これは、シナリオ スコープ内にあるためです。ただし、ActionListener 内で使用すると、Scenario スコープではなく ActionListener スコープになります。そのため、アクション リスナー内で変数「number」を直接見ることができず、現在いる Scenario のインスタンスにアクセスする必要があります。これは Scenario.this によって実行できます。

于 2013-10-07T15:18:13.683 に答える