別の匿名クラスから匿名クラスの「名前のない」Jbuttonにアクセスしますか?

StackOverflow https://stackoverflow.com/questions/286651

質問

アルファベットの各文字としてラベル付けされた匿名の 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()と押されたキーを比較して、コンポーネントを反復処理することもできます。

他の誰かが言ったように、匿名クラスはローカルファイナルだけでなく外部クラスのメンバーにもアクセスできます

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top