新規ダイアログの生成


  1. 目的
    新規のダイアログを生成し、そこで取り込んだ情報を親のアプレットに渡す方法を紹介します。

  2. 手法

    1. 新規クラス
      別のダイアログ(ウインドウ)を作成するには Frame を extends した新規クラスが必要です。
       Jbuilderの場合、新規クラスを作成するにはファイルメニューの新規クラスを指定します。クラスウイザードが現れます。パッケージ名はそのままで、クラス名を適当(ここではnewDg)に設定し、親ダイアログをメニューからjava.awt.Frameとします。



       Jbuilderでない場合、別の java ファイルに 新規クラスを作成します。

    2. サイズ指定
      新規ダイアログではコンストラクタで初期サイズや位置を設定します。コンストラクター(newDg()に、サイズを指定するsetSize(200,150);と表示位置を指定するsetLocation(100,200);を追加します。

      public class newDg extends Frame {
      public newDg() {
       setSize(200,150);
       setLocation(100,200);
      }
      }

    3. 部品の配置
       Frameを継承した新規クラスnewDg.javaに上記のサイズと位置を設定し、コンパイルします。newDg.javaクラスを選択して、設計タグに切り替えれば、部品を配置できます。ここでは、ボタンと文字編集を配置します。



      配置を行うと、コンストラクタに jbInit(); が追加され、部品生成と配置のメソッドが自動生成されます。
       ボタンを押したとき、新規ダイアログのTexfTieldの内容を、元のアプレットに移すメソッドです。

    4. 新規ダイアログの生成
      これで、新規ダイアログのクラスが作成できました。アプレット側で、新規クラスのインスタンスを生成する文を追加します。

       newDg anewdg;
       anewdg = new newDg();

      これで、新規クラスとダイアログが自動生成されますが、標準ではダイアログは非表示になっています。可視にするには、

       anewdg.setVisible(true);

      を実行します。

    5. 新規ダイアログからのアクセス
       親のダイアログから新規ダイアログを生成し、anewdg を利用して新規ダイアログの情報を取得できますが、新規ダイアログから親ダイアログに情報を伝えたり、親ダイアログの情報を取得することはできません。
       そこで、新規ダイアログの生成時に、親のクラス参照(this)を渡すことにします。このため、新規クラスのコンストラクタを修正し、次のように参照変数 parent とコンストラクタの引数 pt を追加します。

      public Applet1 parent;
        ..
      public newDg(Applet1 pt) {
       try {
       jbInit();
      }
      catch(Exception e) {
      e.printStackTrace();
      }
       setSize(200,150);
       setLocation(100,200);
       this.parent=pt;
      }

      メインクラスで、新規ダイアログを生成するとき、thisを渡します。

       anewdg = new newDg(this);

      新規クラスで親のメソッドgetNameEx()を呼び出すには、

       parent.getNameEx();

      とします。たとえば、新規クラスのokボタンで、parent.getNameEx();を呼び出し、getNameEx();で、

       anewdg.setVisible(false);

      を実行すれば、新規ダイアログを非表示にできます。

  3. プロジェクト

    1. 目的
      メインクラス(アプレット)の文字編集部品に、ダイアログで設定した文字列を表示します。

    2. 操作
      親のダイアログでnewDialogボタンを押すと、新規ダイアログが表示されます。ここで、文字編集を行い okボタン を押すと、新規ダイアログが消え、アプレットに新規ダイアログで編集した文字が表示されます。

    3. アプレットクラス

      1. アプレットの作成
        newDialogの名前でプロジェクトを作成し、Applet1クラスを生成します。

      2. レイアウト
        文字列編集と、ボタン部品を配置します。ボタンのラベルをnewDialogとします。



      3. 主要変数
        newDg anewdg; //新規クラスを参照する変数です

      4. メソッド

        1. button1_actionPerformed(ActionEvent e)
          newDialogボタンを押したとき呼び出されるメソッドです。thisを引き渡して、新規クラスを生成し、ダイアログを可視にします。

          void button1_actionPerformed(ActionEvent e) {
          anewdg = new newDg(this);
          anewdg.setVisible(true);
          }

        2. getNameEx()
          新規ダイアログのokボタンで呼び出されます。新規クラスの編集文字を取得し、新規ダイアログを不可視にします。

          void getNameEx(){
           //String name=anewdg.namex;
           textField1.setText(anewdg.textField1.getText());
           anewdg.setVisible(false);
          }

      5. ソース

        package newdialog;
        
        import java.awt.*;
        import java.awt.event.*;
        import java.applet.*;
        
        public class Applet1 extends Applet {
          boolean isStandalone = false;
          Button button1 = new Button();
          newDg anewdg;
          TextField textField1 = new TextField();
          //引数値の取得
          public String getParameter(String key, String def) {
            return isStandalone ? System.getProperty(key, def) :
              (getParameter(key) != null ? getParameter(key) : def);
          }
        
          //アプレットの構築
          public Applet1() {
          }
          //アプレットの初期化
          public void init() {
            try {
              jbInit();
            }
            catch(Exception e) {
              e.printStackTrace();
            }
          }
        
          //コンポーネントの初期化
          private void jbInit() throws Exception {
            button1.setLabel("newDialog");
            button1.setBounds(new Rectangle(71, 120, 98, 27));
            button1.addActionListener(new java.awt.event.ActionListener() {
              public void actionPerformed(ActionEvent e) {
                button1_actionPerformed(e);
              }
            });
            this.setLayout(null);
            textField1.setText("textField1");
            textField1.setBounds(new Rectangle(56, 71, 129, 23));
            this.add(textField1, null);
            this.add(button1, null);
          }
        
          void button1_actionPerformed(ActionEvent e) {
            anewdg = new newDg(this);
            anewdg.setVisible(true);
          }
        
          void getNameEx(){//新規ダイアログから呼び出される
            //String name=anewdg.namex;
            textField1.setText(anewdg.textField1.getText());
            anewdg.setVisible(false);
          }
        
        }

    4. 新規クラス

      1. クラスの生成
        ファイルメニューの「新規クラス」で生成します。詳細は「手法」を参照してください。プロジェクトにnewDg.javaが追加されます。

      2. レイアウト
        newDg.javaを選択して、設計ボタンを押します。ダイアログが表示されない場合、プロジェクトの「ビルド」を行って下さい。新規クラスがFrameを継承し、コンパイルにエラーがなければ表示されるはずです。
         手法で例とした、okボタンと文字編集を配置します。

      3. 変数
        public Applet1 parent; アプレットへの参照変数です。

      4. コンストラクタの変更
        コンストラクタは新規クラスを作成すると、自動生成されます。jbInit()のメソッド呼び出しは、部品を配置すると自動的に生成されます。必要な編集は、引数 Applet1 pt の追加と、

         setSize(200,150);
         setLocation(100,200);parent=pt;

        の追加です。ダイアログのサイズ、位置の設定し、アプレットの参照値を記録します。

        public newDg(Applet1 pt) {
        try {
         jbInit();
        }
         catch(Exception e) {
         e.printStackTrace();
        }
         setSize(200,150);
         setLocation(100,200);
         parent=pt;
        }

      5. button1_actionPerformed(ActionEvent e)
        okボタンで呼び出されるメソッドです。アプレットのgetNameEx()を呼び出します。

        void button1_actionPerformed(ActionEvent e) {
        parent.getNameEx();
        }

      6. ソース
         新規のダイアログのクラスはこんな感じです。
        public class newDg extends Frame {
        
         public Applet1 parent;//親の参照
        
          TextField textField1 = new TextField();
          Button button1 = new Button();
        
          public newDg(Applet1 pt) {//コンストラクタ
            try {
              jbInit();
            }
            catch(Exception e) {
              e.printStackTrace();
            }
            setSize(200,150);
            setLocation(100,200);
            parent=pt;
          }
        
          public newDg() {
            try {
              jbInit();
            }
            catch(Exception e) {
              e.printStackTrace();
            }
          }
        
          private void jbInit() throws Exception {//部品配置
            textField1.setText("textField1");
            textField1.setBounds(new Rectangle(20, 29, 164, 25));
            this.setLayout(null);
            button1.setLabel("ok");
            button1.setBounds(new Rectangle(77, 72, 59, 23));
            button1.addActionListener(new java.awt.event.ActionListener() {
              public void actionPerformed(ActionEvent e) {
                button1_actionPerformed(e);
              }
            });
            this.add(textField1, null);
            this.add(button1, null);
          }
        
        //ボタン処理
          void button1_actionPerformed(ActionEvent e) {
            parent.getNameEx();
            //setVisible(false);
          }
        }

  4. 実行

    newDialogボタンで新規ダイアログが現れます。




トップに戻る