0

名前のない Jbutton のアクション リスナーを実装する方法があるかどうか疑問に思っていました。たとえば、アルファベットの各文字のボタンを作成する次の for ループがあります。

for (int i = 65; i < 91; i++){
     alphabetPanel.add(new JButton("<html><center>" + (char)i));
}

for ループを取り除き、各 JButton をハード コーディングしてから、それぞれのアクション リスナーを作成することなく、これらのボタンのそれぞれにアクション リスナーを追加する方法はありますか?

前もって感謝します、

トメク

4

4 に答える 4

4

あなたの質問は少し漠然としています。ループ内にリスナーを追加するようにループを変更するのは簡単です。

ActionListener listener = something;

for (int i = 65; i < 91; i++){
     JButton button = new JButton("<html><center>" + (char)i);
     button.addActionListener( listener );
     alphabetPanel.add(button);
}

ループを変更できない場合は、パネルのすべての子を反復処理し、jbutton である子のいずれかにリスナーを追加できます。

また、テキストを中央に配置するためにhtmlを使用しているのはなぜですか?やり過ぎじゃない?jbutton はすでにテキストを中央揃えにしていませんか?
setHorizo​​ntalAlignement(SwingConstants.CENTER) を使用してそれを行うこともできます。

于 2008-11-11T23:51:11.610 に答える
2

これを行うことの問題は何ですか?

for (int i = 65; i < 91; i++){
     JButton button = new JButton("<html><center>" + (char)i));
     button.addActionListener( new ButtonListener());
     alphabetPanel.add(button);
}

...

class ButtonListener implements ActionListener {
     ButtonListener() {
     }
     public void actionPerformed(ActionEvent e) {
         //TODO:
     }
}

また、ボタンのテキストでボタンを識別できない場合は、ボタンの名前をアルファベット文字で設定できます。

button.setName((char)i)); // or button.setName(i);
于 2008-11-11T23:54:30.777 に答える
1

名前付きで、ボタンのインスタンスを即時メソッドのローカル変数に保存することを意味しているようです。それを回避しようとすると、コードが読みにくくなる可能性があります。しかし、あなたの質問に答えるには:

最も明白な方法は、古くて新しく人気のある二重ブレースのイディオムを使用することです。

alphabetPanel.add(new JButton("<html><center>" + (char)i) {{
    addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent event) {
            ...
        }
    });
}});

この場合、 i は final ではないため、匿名の内部クラスからは使用できないことに注意してください。それを別の (最終) 変数に割り当てるか、ループを再構成してください。

別のルートは、アクションを経由することです。(通常、アクションは貧乏人のハッシュテーブルであるため、避けることをお勧めします。ただし、ButtonModelは「良い」です。)

alphabetPanel.add(new JButton(new AbstractAction("<html><center>" + (char)i) {
    public void actionPerformed(ActionEvent event) {
        ...
    }
}));

それからもちろん、アプリケーション固有のライブラリの方法があります:

Form alphabetForm = new Form(alphabetPanel);
for (char c='A'; c <= 'Z'; ++c) {
    alphabetForm.button("<html><center>" + c, new ActionListener() {
        public void actionPerformed(ActionEvent event) {
            ...
        }
    });
}
于 2008-11-12T14:27:38.673 に答える
0

以下のように、匿名コンポーネントに ActionListener を追加することができます。

new JButton().addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent arg0) {
                // TODO your action             
            }           
        });

ただし、匿名の JButton をパネルに追加しようとする場合、以下に示すように、JButton のコンストラクターの代わりに addActionListener メソッドの戻り値の型 (void) が使用されるため、このアプローチは機能しません。

for (int i = 65; i < 91; i++){
             alphabetPanel.add(new JButton("<html><center>" + (char)i).addActionListener(new ActionListener(){
                    @Override
                    public void actionPerformed(ActionEvent arg0) {
                        // TODO your action             
                    }           
                }));
        }

上記のコードは、 panel.add() メソッドの無効な引数について不平を言っています。

したがって、あなたの場合、JButton の名前付きインスタンスを作成する必要があります。

これが明確になることを願っています。

敬具、Suresh

于 2008-11-12T02:59:39.000 に答える