Java actionListenerのための無名のJButton?
-
08-07-2019 - |
質問
破壊も修復もおもしろくなるよう行動のリスナー Jbuttonなく、名前を指定できます。例えば、以下のループを生成するボタンをアルファベットの各文字.
for (int i = 65; i < 91; i++){
alphabetPanel.add(new JButton("<html><center>" + (char)i));
}
があるので、とて追加する事ができますアクションリスナーそれぞれのボタンでなく私ためのループとして解各JButtonを作成アクションリスナー?
おかげさまで、事前に
Tomek
解決
ご質問は少し漠然とした.この些細な変更のループを追加するリスナー内側のループ:
ActionListener listener = something;
for (int i = 65; i < 91; i++){
JButton button = new JButton("<html><center>" + (char)i);
button.addActionListener( listener );
alphabetPanel.add(button);
}
できない場合は変更のループが対して繰り返し処理を実行すべてのパネルの子どもたちは、追加リスナーに達するまでの子を養育するjbuttons.
でもなぜhtmlを中心にテキストを使うことができます。ことはできないので失わせないアイテム?なjbuttonが既にセンターテキストを使うことができます。
きsetHorizontalAlignement(SwingConstants.センター)なかなければならない。
他のヒント
これを行うことの問題は何ですか?
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);
名前を付けると、ボタンインスタンスを直接のメソッドのローカル変数に格納することを意味しているように見えます。それを避けようとすると、コードが読みにくくなります。しかし、あなたの質問に答えるには:
最も明白な方法は、古いが新しく人気のある二重括弧イディオムを使用することです。
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) {
...
}
});
}
以下のような匿名コンポーネントに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