- ベストアンサー
JDialogを閉じた時の処理
初めまして JDialogを継承してOutputDialogと言うクラスを作り、モーダルなダイアログを作りました。上の×ボタンで閉じるだけではなく、閉じやすいようにJButtonでも閉じられるようにしたいと思ったのですが、×ボタンと同じ処理をするには何の処理を呼び出したらよいのでしょうか。 dispose()やsetVisible(false)だと、モーダルなままで消えてしまいましたので、setModal(false)とsetVisible(false)を両方使ったのですが、これで問題ないでしょうか。どなたか教えて下さい。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
すみません。こちらの環境で確認したところ WindowEvent.WINDOW_CLOSEDではダイアログが閉じずにWindowEvent.WINDOW_CLOSINGの場合だとダイアログが閉じました。WindowEvent.WINDOW_CLOSINGで閉じるかどうか確認していただけないでしょうか? 以下、動作確認したソース import java.awt.Toolkit; import java.awt.event.WindowEvent; public class OutputDialog extends javax.swing.JDialog { public OutputDialog(java.awt.Frame parent, boolean modal) { super(parent, modal); initComponents(); } private void initComponents() { jPanel1 = new javax.swing.JPanel(); jButton1 = new javax.swing.JButton(); jButton2 = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); jButton1.setText("jButton1"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); } }); jPanel1.add(jButton1); jButton2.setText("jButton2"); jPanel1.add(jButton2); getContentPane().add(jPanel1, java.awt.BorderLayout.NORTH); pack(); } private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING)); } public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new OutputDialog(new javax.swing.JFrame(), true).setVisible(true); } }); } private javax.swing.JButton jButton1; private javax.swing.JButton jButton2; private javax.swing.JPanel jPanel1; }
その他の回答 (2)
- hrm_mmm
- ベストアンサー率63% (292/459)
modalなJDialog 側からhide()でダイアログを閉じると、JDialogを呼び出したowner側のJDialog.show()発行の次の行へ実行が移りますけど。 よって親元の操作が可能になり、FileDialogのように、親元からダイアログ内の設定データ参照も可能になります。 modalダイアログを閉じるってそういう動作をさせたいのじゃないのかな?
お礼
今晩は。返事が遅くなって申し訳ありません。 実はhide()をAPI仕様書で調べた所、推奨されていないと書いてあり、setVisible(false)を使うよう書いてあったので、使いませんでした。 以前JFrameで、閉じた時にSystem.exit(0)を呼ばないでアプリケーションを作った所、フレームを閉じた後再起動しようとしてエラーになったことが有りました。JDialogを使う時も、×で閉じないでJButtonで閉じる時は、うまくやらないと同じような問題が起こるのではないかと思った訳ですが、System.exit(0)で終わらせたくは無い訳です。 深夜なのですぐには出来ませんが、皆さんに教えていただいた方法等を後で試して、ご報告いたします。
- nfonfonfo
- ベストアンサー率63% (12/19)
JButtonボタンのイベントの部分で(WINDOW_CLOSING or WINDOW_CLOSED)イベントをOutputDialogのインスタンスに対して発生させればいいと思います。 JButtonの閉じるボタンをクリック->イベント内でWindowsEventを発火(postEvent)->WindowEventの処理 参考コード(WINDOW_CLOSEDイベントを発火させる方法) ↓の thisの部分はOutputDialogのインスタンスを指定してください。 Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSED)); 参考URL AWT のイベントを自分で発生させるにはどうすればよいのですか?
- 参考URL:
- http://javafaq.jp/S065.html
お礼
今晩は。回答を頂いて、どうも有り難う御座います。 後で、教えていただいた方法を試したり、リンク先の内容を良く読んで、 色々やって見ます。
補足
今晩は。下記コードで実験してみました。 public void actionPerformed(ActionEvent e) { String s=((JButton)e.getSource()).getText(); if(s.equals("Close")){ Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSED)); //setModal(false); //dispose(); } if(s.equals("CSVファイルを出力")){ setOutput(); } } これはOutputDialog内のメソッドですが、何も起こりませんでした。 テスト方法に間違いが有ったら申し訳ないのですが、API 仕様書を読んだ所、WindowsEventは、ウィンドウの状態が変わったことを示す低レベルのイベントと書いてあるので、ウインドウを閉じるため、と言うよりは、ウインドウを閉じる事によって発生するイベントではないでしょうか。 もちろん、これをリスナーで受けてsetModal(false),dispose()等の処理をしても良いのですが、私はむしろ必要な処理が他にあれば上記のメソッド内で処理したいと考えています。 恐縮ですが、私の考えに間違いが有ったら、ご指摘いただけたら幸いです。
お礼
今晩は。返事が遅くなって申し訳ありません。今仕事から帰って来た所です。 教えて頂いた方法を、また試して見ます。
補足
今試した所、教えていただいた方法でうまく行きました。使ったコードは下記です。(前と同じです。)どうも有り難う御座いました。 public void actionPerformed(ActionEvent e) { String s=((JButton)e.getSource()).getText(); if(s.equals("Close")){ Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING)); //setModal(false); //dispose(); } if(s.equals("CSVファイルを出力")){ setOutput(); } }