QA@IT

アクションリスナーの結果によって次のアクションリスナー実行有無を制御させたい(Java5.0)

2727 PV

Java5.0(swing)で作成したボタンAを押下すると、メッセージダイアログを表示し、
OKボタンを押下すると印刷する。キャンセルボタンを押すと何もしないという処理を作りたいです。

メッセージダイアログがない状態で印刷処理のリスナーが動く事は確認できているのですが、
メッセージダイアログと組み合わせての制御がうまくできません。
下記のようなソースにすると、OKボタンを押しても何も動かないのに、再度ボタンAを押すと印刷が走ります。
想定する処理にするには、どのようにすればよろしいでしょうか。
よろしくお願いします。


private JButton printBtn = null;

// ボタンA
protected javax.swing.JButton getPrintButton() {
    if(printBtn == null) {
        printBtn = new javax.swing.JButton();
        【printBtnの座標や名前をセット】
        printBtn.addActionListener(new A01Listener()); // メッセージを出すリスナー(OK/CANCEL)
    }
    return printBtn;
}

class A01Listener implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
        【メッセージを出す】

        if (【OKボタン押下】) {
            printBtn.addActionListener(new A02Listener()); // 印刷処理を開始するリスナー
        }
    }
}

回答

入れ子として呼び出せますよ。

class A01Listener implements ActionListener
{
 private ActionListener actionlistener = new A02Listener();

 public void actionPerformed(ActionEvent e){
  /*【メッセージを出す】*/
   if (/*【OKボタン押下】*/) {
    actionlistener.actionPerformed(e); // 印刷処理を開始するリスナー
  }
 }
}

これだけです。それよりも、動作保証が出来ているため、修正したくないという方が気になります。
A02Listenerは内容の詳細は分かりませんが、本来の使い方と変わっているため、新しい動作保証をするテストが必要なはずですよ。ご検討ください。

編集 履歴 (0)

質問者です。遅くなりましたが、コメントありがとうございます。

教えて頂いた方法で動作確認できました。ありがとうございます。
仰る通り、既存部品についても検証が必要だと思いますので、
テスト観点に加えるようにしました。

編集 履歴 (0)

質問者です。丁寧なコメントありがとうございます。

今回、メッセージダイアログを新たに追加することになったのですが、
印刷処理のリスナー(java.awt.event.ActionListenerを実装している)は
既に動作保障できている部品のため、出来ればリスナーのまま使いたいです。

おかげさまで、メッセージダイアログを表示し、
結果を引数resultで受け取って分岐させるところまではわかりました。

リスナー(actionPerformedメソッド)の処理中に別のリスナーを「入れ子」のように呼出すことは、できないのでしょうか。

編集 履歴 (0)

A01ListenerのactionPerformedの処理ですが、こんな感じだと思います。

public void actionPerformed(ActionEvent e) {
 int result = javax.swing.JOptionPane.showConfirmDialog(this,"本文メッセージ","ウィンドウタイトル",javax.swing.JOptionPane.YES_NO_OPTION);
 if(javax.swing.JOptionPane.YES_OPTION==result){//戻り値がYesボタンの押下だったら
   //印刷処理
 }
}

確認ダイアログの結果は resultで取得できているので、印刷処理にはアクションリスナーは不要です。
Yes/No以外を取得したい!、表示アイコンを変更したい!等はJOptionPane.showConfirmDialogのドキュメントを確認してください。

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。