1

おそらく、私はこれについて間違った方法で進んでいます。SwingとAWTを使用して、フレームにいくつかのボタンを設定し、それぞれに特定の機能IEに対応するActionListenerを持っています

JButton foo_button = new JButton("Foo-Me");
foo_button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        //Fancy schmancy code work
    } 
})
JButton bar_button = new JButton("Bar None");
bar_button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        //Fancy schmancy code work
    } 
})

したがって、これらのボタンはそれぞれ独自の機能を果たします。ただし、すべてのボタンに特定のことを実行させたい場合はどうすればよいでしょうか (それぞれの方法はまったく同じです)。私の場合は、ボタンが独自のことを行う前に、ラベルをクリアします。

明らかに、whatever_label.setText("") を各 actionPerformed() に追加できますが、それには多くの重複が伴います。これはあまり好きではありません。

Java と Swing の達人が助けに来てくれます。

4

3 に答える 3

7

の独自の実装をサブクラス化できますActionListener

private static abstract class MyListener implements ActionListener {

    @Override
    final public void actionPerformed(ActionEvent evt) {
        theSameTask();
        uniqueTask(evt);
    } 
    private void theSameTask() {
        // the identical task
    }
    public abstract void uniqueTask(ActionEvent evt);
}

そして、新しいリスナーは次のようになります。

JButton bar_button = new JButton("Bar None");
bar_button.addActionListener(new MyListener() {
    @Override public void uniqueTask(ActionEvent evt) {
        //Fancy schmancy code work
    } 
});
于 2012-07-17T11:27:44.637 に答える
3

これを行う最良の方法はを使用することだと思いますAction。そうすれば、すべてのリスナーは常に同じことをします。

于 2012-07-17T12:17:39.050 に答える
3

もう 1 つの可能性は、'Decorater' パターンActionListenerを使用して、一般的な動作のデコレータを作成することです。コードは次の形式になります

bar_button.addActionListener(new MyActionListenerDecorator( new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        //Fancy schmancy code work
    }  }) );
于 2012-07-17T12:08:07.680 に答える