3

私は setonclick リスナを作成しています。そのボタンを参照して、そのプロパティを変更できるようにしたいと考えています。つまり、無効にしますか?

次のメッセージが表示されます。

別のメソッドで定義された内部クラス内の非最終変数 confirmButton を参照できません

        confirmButton.setOnClickListener(new View.OnClickListener() {

        public void onClick(View view) {
            confirmButton.setEnabled(false);    
        }



    }); 
4

4 に答える 4

3

これは、おそらく、この方法で使用する匿名クラスからそのボタンにアクセスしようとしているためです。

button.addActionListener(
  new MyListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
      //do your things on button }
    }
  }
);

Java の匿名クラスでは、スコープが分離されているため、宣言されているメソッドで宣言された変数を参照できないため、これは機能しません。クラスにそれを認識させる唯一の方法は、final初期化後に変数が変更されないことをコンパイラに保証する制約を強制し、そのスコープを匿名クラスに拡張できるようにすることです。

これをすばやく修正するには、 のActionEvent内側からボタンにアクセスできactionPerformedます。

((JButton)e.getSource()).setEnabled(false)

それ以外の場合は、どこかを具体的に宣言するか、または属性ActionListenerを使用してメソッドの外側でボタンを宣言する必要があります。特に、別の要素によって起動されるアクションによっていくつかの要素を変更する予定がある場合。staticfinal

于 2010-06-26T14:49:24.613 に答える
1

私は反対をお勧めしgetSourceます; ドキュメントは、それがあなたのボタンになることを約束していません。ボタンfinalをスコープ内に作成するか、より洗練されたクラスを使用することができます

public class ComponentRelevantOnClickListener implements View.OnClickListener {

  private JComponent component;

  public ComponentRelevantOnClickListener(JComponent component) {
    this.component = component;
  }
}

// then, in your code...

confirmButton.setOnClickListener(new ComponentRelevantOnClickListener(confirmButton) {

    public void onClick(View view) {
        component.setEnabled(false);    
    }
});

匿名サブクラスの代わりにアクション クラスとリスナー クラスの設計に移行すると、再利用の機会が増えます (ComponentRelevantOnClickListenerこの目的のためにどこでも使用できる「DisableOnClickListneer」に置き換えることができることは既にわかります)。コードは全体的により適切に設計されます。

于 2010-06-26T15:31:11.757 に答える
0

匿名の内部クラスは、外部スコープの変数にのみアクセスできますfinal。一度だけに割り当てると仮定すると、confirmButton単純に としてタグ付けすることをお勧めしfinalます。

final JButton confirmButton = new JButton();
于 2010-06-26T17:43:43.203 に答える
0

final匿名クラス内で参照される変数は、Java のように定義する必要があります。Jon Skeet は、この記事の中で、この素晴らしい例を紹介しています。

于 2010-06-26T14:49:53.040 に答える