Dialog Boxを表示する


ユーザIDやpasswordを入力させたい場合などに、JDialog classを使うと便利です。
下記のcodeは1つ目が、呼び出しもとのwindowで2つ目が呼び出されたDialog-Boxです。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/*   JDialog class example
 *    owner frame
*/
class ExamJdialogFrame  {
    
      public  static void main(String  argv[])  {
          JFrame frame  = new JFrame();
          ExamJdialog exjd = new ExamJdialog(frame);
          
          frame.addWindowListener( new WindowAdapter() {
              public  void windowClosing(WindowEvent  we)  {
                  System.exit(0);
              }
          });
      
          frame.setSize(300,300);
          frame.show();
          exjd.show();
          
          System.out.println(exjd.getTextValue());
          System.out.println(exjd.getButtonValue());        
      }
}
      


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/*  
 *  
*/
class ExamJdialog extends JDialog  {
      int  ret_val;
      JTextField  jtf;

      ExamJdialog(JFrame f)  {
    //      super(f, "dispose test");                //non-modal    
          super(f, "dispose test",  true);      //modal
          jtf  = new  JTextField();
          JButton  jb_ok   = new  JButton("OK");
          JButton  jb_no   = new  JButton("NO");

          jb_ok.addActionListener(new ActionListener() {
              public void actionPerformed(ActionEvent ae) {
                  ret_val = 1;
                  dispose();
              }
          });
          jb_no.addActionListener(new ActionListener() {
              public void actionPerformed(ActionEvent ae) {
                  ret_val = 2;
                  dispose();
              }
          });
          getContentPane().add("North", jtf);
          getContentPane().add("West", jb_ok);
          getContentPane().add("East", jb_no);
          pack();

      }
      String getTextValue() {
          return  jtf.getText();
      }
      int getButtonValue() {
          return  ret_val;
      }
}





<operation>

dialog boxに入力し、OKボタンもしくはNOボタンを押します。
dialog boxは消去され、コンソール画面に
結果が表示されます。



<実行結果>
Dialog Boxがmodalの場合。

コンソールに入力値が表示され、
次の行にOKの場合は1、NOの場合は2が表示されます。

Dialog Boxがnon-modalの場合。

起動直後にコンソールに空白行と、次の行に0と表示されます。
TextFieldに入力し、OKボタンを押しても反応はありません。


<modalとnon-modal>

modal dialogとは、そのdialogの処理が終わらなければ、他のwindowはアクティブに出来ません。
non-modalであれば、そのdialogの処理が終わらなくても、他のwindowの処理が行えます。
コンストラクタの引数でtrueを与えるか、setModal() methodでtrueを与えるとmodalの指定になります。

dialogにmodalを指定すると、dialogのshow() methodを実行したところで、owner frame側の処理が止まります。
dialogがdisposeされると、再び処理がownerに移り、次の処理が実行されます。
(hide methodでも同様だと推定されます。)
non-modalの指定であれば、owner frame側の処理は止まらずに実行されるために、sampleのように0が表示されます。
0はint型をメンバ変数で使用したときの初期値です。

dialogはdispose method実行の後でも、そのオブジェクトを扱う(methodを呼び出すなど)ことが可能です。