• ベストアンサー

JDialogを閉じた時の処理

 初めまして    JDialogを継承してOutputDialogと言うクラスを作り、モーダルなダイアログを作りました。上の×ボタンで閉じるだけではなく、閉じやすいようにJButtonでも閉じられるようにしたいと思ったのですが、×ボタンと同じ処理をするには何の処理を呼び出したらよいのでしょうか。  dispose()やsetVisible(false)だと、モーダルなままで消えてしまいましたので、setModal(false)とsetVisible(false)を両方使ったのですが、これで問題ないでしょうか。どなたか教えて下さい。  

質問者が選んだベストアンサー

  • ベストアンサー
  • nfonfonfo
  • ベストアンサー率63% (12/19)
回答No.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; }

nicewind
質問者

お礼

 今晩は。返事が遅くなって申し訳ありません。今仕事から帰って来た所です。  教えて頂いた方法を、また試して見ます。

nicewind
質問者

補足

 今試した所、教えていただいた方法でうまく行きました。使ったコードは下記です。(前と同じです。)どうも有り難う御座いました。    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(); } }

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.2

modalなJDialog 側からhide()でダイアログを閉じると、JDialogを呼び出したowner側のJDialog.show()発行の次の行へ実行が移りますけど。 よって親元の操作が可能になり、FileDialogのように、親元からダイアログ内の設定データ参照も可能になります。 modalダイアログを閉じるってそういう動作をさせたいのじゃないのかな?

nicewind
質問者

お礼

 今晩は。返事が遅くなって申し訳ありません。    実はhide()をAPI仕様書で調べた所、推奨されていないと書いてあり、setVisible(false)を使うよう書いてあったので、使いませんでした。  以前JFrameで、閉じた時にSystem.exit(0)を呼ばないでアプリケーションを作った所、フレームを閉じた後再起動しようとしてエラーになったことが有りました。JDialogを使う時も、×で閉じないでJButtonで閉じる時は、うまくやらないと同じような問題が起こるのではないかと思った訳ですが、System.exit(0)で終わらせたくは無い訳です。  深夜なのですぐには出来ませんが、皆さんに教えていただいた方法等を後で試して、ご報告いたします。  

全文を見る
すると、全ての回答が全文表示されます。
  • nfonfonfo
  • ベストアンサー率63% (12/19)
回答No.1

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
nicewind
質問者

お礼

 今晩は。回答を頂いて、どうも有り難う御座います。    後で、教えていただいた方法を試したり、リンク先の内容を良く読んで、 色々やって見ます。

nicewind
質問者

補足

 今晩は。下記コードで実験してみました。 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()等の処理をしても良いのですが、私はむしろ必要な処理が他にあれば上記のメソッド内で処理したいと考えています。  恐縮ですが、私の考えに間違いが有ったら、ご指摘いただけたら幸いです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • モーダレスダイアログについて

    はじめまして。 モーダレスダイアログについて質問がございます。フレーム(JFrame 継承)から、このフレームを所有者とするモーダレスダイアログ(JDialog 継承)を表示した状態で、マウスクリックによりフレームをアクティブにした場合、フレームは背面に表示されたままとなりますが、このフレームをダイアログの前面に表示させることは可能でしょうか?ご存知の方がいらっしゃいましたらご教授願います。尚、下記にサンプルソースを記載します。 ■環境  OS:WinXP  java:j2sdk1.4.2_08 ※ダイアログ生成時に所有者を指定しなければ、フレームをダイアログ前面に表示させることが可能ですが、この方法だと再度モーダレスダイアログをアクティブにした場合、上記とは別インスタンスのフレームから表示されたモーダレスダイアログも連動して前面に表示されるという事象を確認しております。 public class ParentFrame extends JFrame implements ActionListener { public static void main(String[] args) { ParentFrame frame = new ParentFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } public ParentFrame() { super("親フレーム"); setSize(300, 200); setLocationRelativeTo(null); JButton btn = new JButton("ダイアログ表示"); btn.addActionListener(this); getContentPane().add(btn); } public void actionPerformed(ActionEvent e) { // モーダレスダイアログ生成 JDialog dlg = new JDialog(this, "子ダイアログ"); dlg.setSize(200, 100); dlg.setLocationRelativeTo(this); dlg.setVisible(true); } }

  • JDialog でコンパイルエラーになります

    環境:WindowsXP,j2sdk1.4.0 Javaを勉強しているのですが、swingクラスのJDialog ,Jwindowを使用するとコンパイルエラーになります。 (JFrameの場合は、問題なく表示されます) ソースとエラー内容は以下の通りです。 ・ソース import java.awt.*; import java.awt.event.*; import javax.swing.*; class JDialog{ public static void main(String [] args) { JDialog jd =new JDialog(); jd.setBounds(0, 0, 200, 100); jd.setTitle("JDialog Example"); jd.getContentPane(). setBackground(Color.green); jd.addWindowListener(new MyWindowAdapter()); jd.setVisible(true); } } ・エラー内容 JDialog.java:12: シンボルを解釈処理できません。 シンボル: メソッド setBounds (int,int,int,int) 位置 : JDialog の クラス jd.setBounds(0, 0, 200, 100); ^ JDialog.java:13: シンボルを解釈処理できません。 シンボル: メソッド setTitle (java.lang.String) 位置 : JDialog の クラス jd.setTitle("JDialog Example"); ^ JDialog.java:15: シンボルを解釈処理できません。 シンボル: メソッド getContentPane () 位置 : JDialog の クラス jd.getContentPane().setBackground(Color.green); ^ JDialog.java:16: シンボルを解釈処理できません。 シンボル: メソッド addWindowListener (MyWindowAdapter) 位置 : JDialog の クラス jd.addWindowListener(new MyWindowAdapter()); ^ JDialog.java:18: シンボルを解釈処理できません。 シンボル: メソッド setVisible (boolean) 位置 : JDialog の クラス jd.setVisible(true); ^ エラー 5 個 誰か、助けてください!

    • ベストアンサー
    • Java
  • JButtonがsetEnabled(false)の時の文字色

    こんにちは。 タイトルのとおりなのですが、JButtonがsetEnabled(false)の時の文字色って何色なんでしょう? ボタンのテキストを二段にしたいため、 JButton myButton = new JButton(); myButton.setText("<html>上<br>下"); と設定します。 それで、ボタンに触れないようにするとき、 myButton.setEnabled(false); にすると、触れなくはなりますがボタンの文字色が黒のままなんです。 falseのとき文字色をgray,silver,#CCCCCC,#CCCCFFで試しましたが色が違いました・・・。 あの色にするのは無理なのでしょうか!? ご存知の方いましたら、よろしくお願いします。 (二段にする方法が他にあったらそれもお願いします!)

    • ベストアンサー
    • Java
  • イベント処理

    javaでプログラムを作り始めて間がないのですが、イベント処理に関して行き詰ってしまいました。望む動作は、メニュー→ゲーム→じゃんけんと選択すると、初期の状態として「じゃんけん・・・・」という文字とボタンが表示され、どれかボタンを押すと対応して「~ボタンが押されました」と表示させたいのですが、作ったプログラムだと、ボタンを押しても反応しません。後々メニューにもいくつかアイテムを追加したり、最終的にはコンピュータとじゃんけんをするプログラムを書きたいと思っています。ifを使った方法しか思いつかないのですが、どこがおかしいのでしょうか? import javax.swing.*; import java.awt.event.*; import java.awt.BorderLayout; public class question extends JFrame implements ActionListener{       JLabel label1;       JPanel p2;       public static void main(String[] args){            question test = new question("質問");            test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);            test.setVisible(true);       }       question(String title){            setTitle(title);            setBounds( 10, 10, 300, 250);            JMenuBar menuBar = new JMenuBar();            JMenu menu = new JMenu("メニュー");            JMenu submenu = new JMenu("ゲーム");            JMenuItem subitem1 = new JMenuItem("じゃんけん");            subitem1.addActionListener(this);            subitem1.setActionCommand("Start");            submenu.add(subitem1);            menu.add(submenu);            menuBar.add(menu);            setJMenuBar(menuBar);            JPanel p1 = new JPanel();            p2 = new JPanel();            label1 = new JLabel("");            JButton btn1 = new JButton("グー");            btn1.addActionListener(this);            btn1.setActionCommand("goo");            JButton btn2 = new JButton("チョキ");            btn2.addActionListener(this);            btn2.setActionCommand("cyoki");            JButton btn3 = new JButton("パー");            btn3.addActionListener(this);            btn3.setActionCommand("paa");            p1.add(label1);            p2.add(btn1);            p2.add(btn2);            p2.add(btn3);            getContentPane().add(p1, BorderLayout.PAGE_START);            getContentPane().add(p2, BorderLayout.PAGE_END);            p2.setVisible(false);      }      public void actionPerformed(ActionEvent e){            String cmd = e.getActionCommand();            if (cmd.equals("Start")){                 p2.setVisible(true);                 label1.setText("じゃんけん・・・・");                 if (cmd.equals("goo")){                      label1.setText("グーが押されました");                 }else if (cmd.equals("cyoki")){                      label1.setText("チョキが押されました");                 }else if (cmd.equals("paa")){                      label1.setText("パーが押されました");                 }            }       } }

    • ベストアンサー
    • Java
  • ビジュアルベーシックでは、 AddHandlerステートメントがありましたが・・・・・

    ビジュアルベーシックを学んでから、 今度は、Visual C++を勉強していますが・・・ 困っています、 たとえば、ダイアログの上に OK と、Cancel のボタンがあるとします、 ダイアログを表示させて、 OK ボタンを押したら A の処理 Cancel ボタンを押したら B の処理 そして、どちらかの処理が終わったら 続く C の処理を続けてゆく この様にするためには、どうしたらよいのでしょうか? ビジュアルベーシックでは、 AddHandlerステートメントを 使うことができたのですが・・・・ BOOL CXXXDoc::OnNewDocument() { Cfailsettei cf; // 作成したダイアログボックスのクラスです nRet=cf.DoModal();  //モーダルでダイアログを表示     // cf.buttonOK オーケーボタンを押した処理     // cf.buttonCancel キャンセルボタンを押した処理          //処理を続けてゆく if (!CDocument::OnNewDocument()) return FALSE; // TODO: この位置に再初期化処理を追加してください。 // (SDI ドキュメントはこのドキュメントを再利用します。) return TRUE; } どうすれば、良いのでしょうか? よろしくお願いします。

  • setEnabledが効かないのはなぜでしょう

    下記のソースはあるjButton1(JButtonクラス)がクリックされた時の イベント処理メソッドです。 dummyMethodメソッド呼び出しの部分で多少時間のかかる処理を行いますが、 現在開発中の為、ダミーにしてます。(一瞬で返ってきます) その際、そのメソッド呼び出し前でjButton1をdisableに、jButton2を enableしておき、メソッド呼び出し後に今度はjButton1をenable、jButton2を disableにしようと思っております。 今まで、一瞬で返ってくるおかげで処理的にうまくいっているのだろうと 思っていたのですが、dummyMehodメソッド呼び出し後にsleepを入れてみると、 (ソースのコメントをはずした)dummyMethodメソッド呼び出し前のsetEnabledが効いていませんでした。 イベント処理メソッド内でsetEnabledは行えないのでしょうか? よろしくお願いします。 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { jButton1.setEnabled(false); jButton2.setEnabled(true); dummyMethod(); //try { // Thread.sleep(2000); //} catch (InterruptedException ie) { //} jButton1.setEnabled(true); jButton2.setEnabled(false); }

    • ベストアンサー
    • Java
  • java(swing)で、登録ボタンを押すとファイルを読み込みDBに登

    java(swing)で、登録ボタンを押すとファイルを読み込みDBに登録する処理です。 その処理で、登録ボタンを押すと、ダイアログを起動して、処理中とメッセージ表示したいのですが、データが多く、画面が固まった状態になり、メッセージが表示されないのです。何かいい方法ありますでしょうか? ******************************************************************* import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; public class topMain { public static void main(String[] args) { //メニュー画面を起動する topMain frame = new topMain(); frame.topFrame(); } private void topFrame() { JFrame jf = new JFrame(); //フレームのサイズ設定 jf.setSize(1000, 600); jf.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); jf.getContentPane().setLayout(null); JButton b1 = new JButton("登録ボタン"); b1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { //ダイアログボックスを開く     //ダイアログボックスは起動するが、 //メッセージが表示されない、 //おそらく大きいデータを読むとき画面が固まるため //重いファイルを読み込む //DB登録処理 //ダイアログを閉じる } }); jf.getContentPane().add(b1); b1.setBounds(40, 400, 240, 100); jf.setVisible(true); } } *******************************************************************

  • Photoshop JavaScript で処理中の状態表示したりAbortしたりする

    PhotoshopCS2のJavaScriptのプログラムを書いています。 この処理内容が多い場合は長い間Photoshopが黙ったままになって しまうので、処理の進行状況を表示したり、処理を中断させるための ダイアログを表示したいと思っています。 関連資料によると、ダイアログを表示するとダイアログ上の OK,Cancelボタンを押さないと処理が止まったままになって しまうそうです。これを処理を進めながら、ダイアログを 表示させることはできないでしょうか? よろしくお願いします。

  • WinXP JButtonのバックカラーについて

    質問させてください。 XPで以下のように LookAndFeelをセットすると、 new JButton().setBackGround(Color.red); でボタンの背景色が変更できずに、ボタンの輪郭部分の色が変更されてしまいます。 try{ UIManager.setLookAndFeel  UIManager.getSystemLookAndFeelClassName());    } catch(Exception e){ } XPのシステムの設定でしかたなさそうですが、 先ほどの回答していただいた方によると、JButtonを継承したクラスを作成して使えばできそうとあったのですが、 具体的な方法がわかりません。 どなたか詳しい方がいらしましたらたら、クラシック表示にしないで、このLookAndFeelの設定でJButtonの背景色を変更する方法を具体的に教えてください。 よろしくお願いいたします。

  • ダイアログを継承したダイアログの作成について

    お世話になります。 今回お聞きしたいことは、 オリジナルに作成したダイアログを継承したオリジナルのダイアログを作成した際に、オリジナルに作成した基底ダイアログのダイアログ上のコントロールや、そのコントロールの位置を継承することはできますでしょうか? ということです。 何がしたいかといいますと、4つのダイアログをメインダイアログから呼び出すのですが、その4つのダイアログには共通するコントロールがあり、そのコントロールの動作もその位置も全く同じなのです。 そのため、いちいち4つのダイアログにコントロールの貼り付けや、処理を記入せずに、その共通のコントロールをもった基底ダイアログを作成して、その基底ダイアログの継承としてダイアログが作れたらなと思い、質問させて頂きました。 継承をすると、基底クラスの関数等を使うことができるというのはわかるのですが、ダイアログ上のコントロールの位置までは不可能なのかなと疑問に思いました。 ご回答を宜しくお願い致します。 開発環境は Windows CE 6.0 Visual Studio 2005 です。