2017-02-11 8 views
0

こんにちは、私はJava Swingを初めて使用しています。上記のコードは、良い作品Java Swing-external classからactionlisnerを呼び出してください。

Class A extends JDialog 
{ 

JButton button=new JButton(" test"); 
button.addActionListener(new TestAction()); 

//Inner class 
private class TestAction extends AbstractAction { 

     public void actionPerformed(final ActionEvent e) { 
      dispose(); 
     } 
    } 
} 

follows-として

は、Swingのクラスを持っています。 内部のTestActionクラスを共通のJavaファイルとして移動して再利用できるようにする必要があります。

public class TestActionNew extends AbstractAction { 

    JFrame frame; 

    TestActionNew() { 
     this.frame = new JFrame(); 

    } 

    public void actionPerformed(final ActionEvent e) { 
     frame.dispose(); 
    } 
} 

はボタン button.addActionListener(新TestActionNew())

に新しいリスナーを追加しました。しかし処分アクションは動作しません。 誰でも私がここで間違っていることを助けることができます。 おかげ

答えて

2

あなたが別のフレームを作成し、入れ子になったクラスとして、disposeを囲むインスタンスで呼び出されている間、その上disposeを呼び出す気に。

あなたはそれを再利用可能にしたい場合は、コンストラクタにdisposeを呼び出すために上のもの渡す必要があります:あなたの他のコードの使用に続いて

public class TestActionNew extends AbstractAction { 

    JFrame frame; 

    TestActionNew (JFrame frame) { 
     this.frame = frame; 

    } 

    public void actionPerformed(final ActionEvent e) { 
     frame.dispose(); 
    } 
} 

を:

JButton button = new JButton(" test"); 
button.addActionListener(new TestAction(this)); 
+0

「Action」を自己完結型に設定して、名前やその他のプロパティを設定してみてはいかがですか。なぜなら、あなたは、あなたがそのAPIの能力を完全に把握していないように、How to Use Actionsを見ることを勧めます。あなたは '新しいJButton(new MySuperAwesomeAction())'を呼び出す必要があります...これはキーバインディングとメニュー項目でも使用できますが、そうでなければ大過剰です – MadProgrammer

2

あなたは可能性があり...

は...直接 ActionListenerサポートを提供

class A extends JDialog { 

    JButton button = new JButton(" test"); 

    public A() { 
    } 

    public void addActionListener(ActionListener listener) { 
     button.addActionListener(listener); 
    } 

    public void removeActionListener(ActionListener listener) { 
     button.removeActionListener(listener); 
    } 

} 

これは、他のクラスに(ボタンIE)の要素を公開する傾向があり、内部の実装について、彼らが知っていることを前提としていない(すなわちactionCommand)あなたは...

が能力を提供できるダイアログ

のカスタムAction

class A extends JDialog { 
    //... 
    public void addAction(Action action) { 
     JButton btn = new JButton(action); 
     buttonPanel.add(btn); 
    } 
} 

を供給することは、このダイアログがActionActionが提供する、それだけで、それを実行するための手段を提供し、ない「何か」を気にする必要はないことを意味します例えば

を成し遂げるために必要な作業のSA自己完結型ユニット、あなたが何かのようにそれを使用することになりAction

...のような
public class CancelAction extends AbstractAction { 

    public CancelAction() { 
     putValue(NAME, "Cancel"); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     // What ever needs to be done here... 
    } 

} 

を与えられた...

A dialog = A(); 
dialog.addAction(new CancelAction()); 

、明らかに、あなたはあなたのニーズにアクションをカスタマイズすることができますが、Actionはその仕事をする必要がある情報を渡しますが、ダイアログは気にしません

あなたはuld ...

ダイアログが実行するアクションを指定する定義済みのインターフェースを作成します。

public interface AListener { 
    public void wasCancelled(A dialog); 
    public void wasAccepted(A dialog); 
} 

あなたはその後、Aのインスタンスにこのリスナーを添付し、それはそう

class A extends JDialog { 
    //...  
    private Set<AListener> listeners = new HashSet<>(); 

    public void addAListener(AListener listener){ 
     listeners.add(listener); 
    } 

    public void removeAListener(AListener listener){ 
     listeners.add(listener); 
    } 

    protected void fireWasCancelled() { 
     for (AListener listener : listeners) { 
      listener.wasCancelled(this); 
     } 
    } 

    protected void fireWasAcceppted() { 
     for (AListener listener : listeners) { 
      listener.wasAccepted(this); 
     } 
    } 
} 

を実行していますとき、いくつかの「アクション」は、ダイアログ内で発生する場合、適切な行動を取るだろう(ボタンのようにクリックされました) 、あなたが登録されているすべてのリスナーに通知するために、関連するfireXxxメソッドを呼び出します

A aDialog = new A(); 
aDialog.addAListener(new AListener() { 
    @Override 
    public void wasCancelled(A dialog) { 
     // Do stuf 
    } 

    @Override 
    public void wasAccepted(A dialog) { 
     // Do stuff 
    } 
}); 

これは、ダイアログはある機能を定義します実行することを望んでおり、それらについて知る必要のないクラス間で実装の詳細を過度に公開することなく、追加のタスクを実行するための制御(およびコンテキスト)を提供します。

あなたは...

ただ、ユーザに情報を表示し、ユーザが

あなたが使用する必要があります

をやった上でフィードバックをご提供するための自己完結型のAPIを提供JOptionPaneを、使用することができます。.. ?

お客様のニーズに最も適した手法を使用してください。

個人的には、ボタン、キーバインディング、メニュー項目で使用できる自己完結型の再利用可能な作業単位であることを好みますが、非常に柔軟性がありますが、 "ok"/"cancel"ボタンは、少し殺されるかもしれません。

あなたは第二のアイデアを取り、単にあなたが「OK」をカスタマイズし、むしろ、あなたが欲しい、これまでどのようなアクションを供給するための柔軟性よりも、直接アクションを「取り消す」ことを可能にする機能を提供し、一例として可能性が

I

関連する問題