1

Javaで単純なGUIプログラムを作成しようとしていますが、エラーの適切な解決策が見つかりませんでした。別のメソッドで定義された内部クラス内の非最終変数を参照できません。

これが私のこれまでの小さなコードです。

myPanel = new JPanel();

JButton myButton = new JButton("create buttons");
myButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        int val = Integer.parseInt(textfield.getText());
        for(int i = 0; i < val; i++) {
            JButton button = new JButton("");
            button.setText(String.valueOf(i));
            button.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    clickButton(i);
                }
            });
            myPanel.add(button);
            myPanel.revalidate();
        }
    }
});

たぶん私のアプローチは完全に間違っています。私がやろうとしているのは、ボタンのセットを作成し、ユーザーがボタンを押すと、「ボタン4を押しました」または「ボタン10を押しました」などのメッセージを表示したいとします。

4

3 に答える 3

7

i内部クラスがアクセスできるようにするには、final にする必要があります。これを final 変数にコピーすることで回避できます。

forただし、ループの内容を次のような別のメソッドにリファクタリングすることをお勧めします。

for(int i = 0; i < val; i++) {
    myPanel.add(makeButton(i));
    myPanel.revalidate();
}

...

private JButton makeButton(final int index) {
    JButton button = new JButton("");
    button.setText(String.valueOf(index));
    button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            clickButton(index);
        }
    });

    return button;
}
于 2010-09-28T04:49:34.683 に答える
1

この問題を回避するには、myPanel をクラスのメンバー変数として宣言するか、クラスのメンバーを参照する別のものを使用する必要があります。

于 2010-09-28T04:49:05.447 に答える
1

匿名クラスは、変更されないことが保証されるように、final として宣言されたローカル変数のみを使用できます。

于 2010-09-28T04:56:15.903 に答える