別の匿名クラスから匿名クラスの「名前のない」Jbuttonにアクセスしますか?
-
08-07-2019 - |
質問
アルファベットの各文字としてラベル付けされた匿名の actionListener
に26個の JButton を作成しました。
for (int i = 65; i < 91; i++){
final char c = (char)i;
final JButton button = new JButton("" + c);
alphabetPanel.add(button);
button.addActionListener(
new ActionListener () {
public void actionPerformed(ActionEvent e) {
letterGuessed( c );
alphabetPanel.remove(button);
}
});
// set the name of the button
button.setName(c + "");
}
現在、匿名の keyListener
クラスがあり、キーボードでどの文字が押されたかに基づいてボタンを無効にしたいと思います。したがって、ユーザーがAを押すと、 A ボタンは無効になります。現在の実装を考えると、これも可能ですか?
解決
両方のリスナーがアクセスできるように、クラスレベルで26個のJButtonオブジェクトの配列を単純に宣言しないでください。匿名の内部クラスは、最終変数だけでなくクラス変数にもアクセスできると思います。
他のヒント
ボタンを無効にするか、削除するかはわかりませんか?コードではremoveを呼び出しており、回答では無効化について話している。これを実現するには、AlphaPanelにKeyListenerを追加します。したがって、forループを開始する直前にこれを追加できます。
InputMap iMap = alphabetPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
ActionMap aMap = alphabetPanel.getActionMap();
そしてJButtonに追加されたActionListenerの代わりにこれを呼び出します:
iMap.put(KeyStroke.getKeyStroke(c), "remove"+c);
aMap.put("remove"+c, new AbstractAction(){
public void actionPerformed(ActionEvent e) {
// if you want to remove the button use the following two lines
alphabetPanel.remove(button);
alphabetPanel.revalidate();
// if you just want to disable the button use the following line
button.setEnabled(false);
}
});
getText()と押されたキーを比較して、コンポーネントを反復処理することもできます。
他の誰かが言ったように、匿名クラスはローカルファイナルだけでなく外部クラスのメンバーにもアクセスできます
所属していません StackOverflow