Deep Side of Java〜Java 言語再入門 第4回

AllWidget のソース

多くのウィジットを使ったサンプル」のソースを提供する。

目次






AllWidgetApplet.java

アプレットの場合のメインクラスである。大変簡単であり、ほとんど何もしていない。

import java.applet.*;

public class AllWidgetApplet extends Applet {
    private MyAdaptor ma;
    public void init( ) {
        MyAdaptor ma = new MyAdaptor( this );
        Widgets w = new Widgets( this, ma );
    }
}



AllWidgets.java

スタンドアロンプログラムのメインクラスである。トップレベル Frame の定型的処理の他に、メニューを追加している。

import java.awt.*;
import java.awt.event.*;

public class AllWidgets extends Frame {
    MyAdaptor ma;  /* イベントリスナのクラス */
    public static void main( String [] args ) {
        new AllWidgets();
    }

    private AllWidgets( ) {
        super( "Awt Widgets sample" );  /* フレームタイトルの設定 */
        ma = new MyAdaptor( this );     /* リスナクラスの作成 */
        addWindowListener( ma );        /* 終了ボックスを有効に */
        addMenu();
        Widgets w = new Widgets( this, ma ); /* 内容を作る */
        pack();                         /* レイアウトして */
        show();                         /* 表示する */
    }

    private void addMenu( ) {
        /* メニュー制作は次の階層がある。
           Frame -> MenuBar -> Menu -> MenuItem or CheckboxMenuItem
           この階層に従って制作する。*/
        
        /* メニューボタンの制作 */
         Menu men = new Menu( "Menu" );

         /* 各メニュー項目の制作 */
         MenuItem load = new MenuItem( "load" );
         MenuItem save = new MenuItem( "save" );
         CheckboxMenuItem func1 = new CheckboxMenuItem( "setting1" );
         CheckboxMenuItem func2 = new CheckboxMenuItem( "setting2" );
         MenuItem mquit = new MenuItem( "quit" );

         /* 各メニュー項目に対してイベントリスナを設定 */
         load.addActionListener( ma );
         save.addActionListener( ma );
         mquit.addActionListener( ma );
         func1.addItemListener( ma );
         func2.addItemListener( ma );

         /* ボタンの有効化/無効化 */
         load.setEnabled(true); mquit.setEnabled(true);
         save.setEnabled(false); 

         /* メニューボタンに項目を追加する。セパレータも入れることができる */
         men.add( load ); men.add( save ); men.addSeparator();
         men.add( func1 ); men.add( func2 ); men.addSeparator(); 
         men.add( mquit );

         /* メニューバーの制作 */
         MenuBar mbar = new MenuBar();

         /* メニューバーにボタンを取り付ける */
         mbar.add( men );

         /* フレームにメニューバーを取り付ける */
         setMenuBar( mbar );
    }
}



Widgets.java

各種 Widget を生成し、マップする。ただ作っているだけである。

import java.awt.*;
import java.awt.event.*;

public class Widgets {
    private GridBagLayout gbl = new GridBagLayout( );
    private GridBagConstraints gc = new GridBagConstraints();

    public Widgets( Container c, MyAdaptor ma ) {
        /* 全体のセットアップ */
        c.setLayout( gbl );  /* レイアウトマネージャを設定 */
        c.setFont( new Font( "Dialog", Font.BOLD, 12 ) );
        gc.gridx = 0;
        gc.insets = new Insets( 10, 20, 10, 20 );  /* 各ウィジット間の間隔 */
         
        /* 以降各ウィジットの作成と add。要するに */
        /* 1. gc.gridy = n;  で位置を決め
           2. MyPanel を作成し、
           3. 各ウィジットを作成し、
           4. 必要に応じて各ウィジットのプロパティをセットし、
           5. MyPanel に add する。
           6. 必要があればリスナを MyAdaptor クラスにセットし
           7. GridBagConstranints をレイアウトマネージャにセットして
           8. 上位ウィジット(Applet かFrame)に MyPanel を add する。
        */

        /* Label Widget */
        gc.gridy = 0;
        Panel pan0 = new MyPanel( "Label の例" );
        Label lab = new Label( "Label Widget of AWT" );
        pan0.add( lab );
        gbl.setConstraints( pan0, gc );
        c.add( pan0 );

        /* Button Widget */
        gc.gridy = 1;
        Panel pan1 = new MyPanel( "Button の例" );
        Button quit = new Button( "Quit" );
        pan1.add( quit );
        quit.addActionListener( ma );
        gbl.setConstraints( pan1, gc );
        c.add( pan1 );

        /* List Widget */
        gc.gridy = 2;
        Panel pan2 = new MyPanel( "List の例" );
        List lis = new List( 4, false );
        lis.addActionListener( ma );
        lis.add( "No.1 This is a Sample" );
        lis.add( "No.2 of List Widget" );
        lis.add( "No.3 in AWT Toolkit" );
        lis.add( "No.4" );
        lis.add( "No.5" );
        pan2.add( lis );
        lis.addItemListener( ma );
        gbl.setConstraints( pan2, gc );
        c.add( pan2 );

        /* Choice Widget */
        gc.gridy = 3;
        Panel pan3 = new MyPanel( "Choice の例" );
        Choice cho = new Choice();
        cho.addItem( "Choice の選択項目1" );
        cho.addItem( "Choice の選択項目2" );
        cho.addItem( "Choice の選択項目3" );
        pan3.add( cho );
        cho.addItemListener( ma );
        gbl.setConstraints( pan3, gc );
        c.add( pan3 );

        /* Checkbox Widget -- ラジオボタン */
        gc.gridy = 4;
        Panel pan4 = new MyPanel( "Checkbox -- ラジオボタン風排他的選択", true );
        CheckboxGroup cbg = new CheckboxGroup();
        Checkbox cb1 = new Checkbox( "Checkbox 項目1", cbg, true );
        Checkbox cb2 = new Checkbox( "Checkbox 項目2", cbg, false );
        Panel pan5 = new Panel( );
        pan5.add( cb1 );
        pan5.add( cb2 );
        pan4.add( "Center", pan5 );
        cb1.addItemListener( ma );
        cb2.addItemListener( ma );
        gbl.setConstraints( pan4, gc );
        c.add( pan4 );


        /* Checkbox Widget -- いわゆるチェックボックス */
        gc.gridy = 5;
        Panel pan6 = new MyPanel( "Checkbox -- チェックボタン風非排他的選択" , true );
        Checkbox cb3 = new Checkbox( "Checkbox 項目3" );
        Checkbox cb4 = new Checkbox( "Checkbox 項目4" );
        Panel pan7 = new Panel();
        pan7.add( cb3 );
        pan7.add( cb4 );
        pan6.add( "Center", pan7 );
        cb3.addItemListener( ma );
        cb4.addItemListener( ma );
        gbl.setConstraints( pan6, gc );
        c.add( pan6 );

        /* TextField Widget */
        gc.gridy = 6;
        Panel pan8 = new MyPanel( "TextField の例" );
        TextField tf = new TextField( "This is TextField Widget Sample." );
        pan8.add( tf );
        tf.addActionListener( ma );
        tf.addTextListener( ma );
        gbl.setConstraints( pan8, gc );
        c.add( pan8 );

        /* TextArea Widget */
        gc.gridy = 7;
        Panel pan9 = new MyPanel( "TextArea の例", true );
        String s = 
            "これは TextArea Widget のサンプルである。よくGUIツールキットには" +
            "ちょっとしたエディタ並のテキストウィジットが存在するが、これはAWT" +
            "でのその例である。\n複数行の文章を編集し、その内容の文章を取得して" +
            "何か役に立つことをすることができる。";
        TextArea ta = new TextArea( s, 7, 50, TextArea.SCROLLBARS_VERTICAL_ONLY );
        pan9.add( "Center", ta );
        ta.addTextListener( ma );
        gbl.setConstraints( pan9, gc );
        c.add( pan9 );

        /* Canvas Widget */
        gc.gridy = 8;
        Panel pan10 = new MyPanel( "Canvas の例〜クリックしよう!", true );
        MyCanvas can = new MyCanvas( 100, 100 );
        can.setBackground( new Color( 0xe0, 0xff, 0xe0 ) ); /* 背景色の設定 */
        can.setForeground( new Color( 0xff, 0, 0 ) );       /* 描画色の設定 */
        pan10.add( "Center", can );
        can.addMouseListener( ma );  /* ダイアログを開く */
        can.addMouseListener( can ); /* クリックした位置に点を描く */
        gbl.setConstraints( pan10, gc );
        c.add( pan10 );
     }
}



MyPanel.java

各種 Widget に共通して与えるパネルクラスを定義するカスタム部品クラス。

import java.awt.*;
import java.awt.event.*;

public class MyPanel extends Panel {
    /* コンストラクタによって、レイアウトマネージャを変える。
       説明ラベルの位置を変えるために過ぎない。*/
     public MyPanel( String s ) {
          setLayout( new FlowLayout() );
          add( new Label( s ) );
          setBackground( Color.white );
     }
     public MyPanel( String s, boolean f ) {
          setLayout( new BorderLayout() );
          add( "North", new Label( s ) );
          setBackground( Color.white );
     }
}



MyAdaptor.java

各種 Widget が生成するイベントを共通して受け取る。adaptor であるが、一種の Mediator でもある。

import java.applet.*;

public class MyAdaptor implements ActionListener, ItemListener, TextListener, 
                                  MouseListener, WindowListener {
    Container top;  /* 上位 Widget, Frame か Applet である。*/
    int count = 0;  /* TextEvent だけ、リアライズで発生するのはうっとおしい */

    public MyAdaptor( Container c ) {
        top = c;  /* ダイアログを開くために、上位 Widget を保存 */
    }

    /* ダイアログを開く */
    private void showDialog( String s ) {
        MyDialog md = new MyDialog( "Dialog Sample", top );
        md.setString( s );
        md.show();
    }

    /* 「選択」を表す */
    public void actionPerformed( ActionEvent ae ) {
        showDialog( "ActionEvent: " + ae );
        Object o = ae.getSource();
        if( top instanceof Applet ) { /* アプレットは終了できない */
            /* NOP */
        } else {  /* スタンドアロンの場合のみ、終了する */
            if( o instanceof Button  ) {
                if( ((Button)o).getLabel().equals( "Quit" ) ){
                    System.exit( 0 );
                }
            } else if( o instanceof MenuItem ) {
                if( ((MenuItem)o).getLabel().equals( "quit" ) ){
                    System.exit( 0 );
                }
            }
        }
    }

    /* リストやチェックボックスなどで発生 */
    public void itemStateChanged(ItemEvent ie) {
        showDialog( "ItemEvent: " + ie );
    }

    /* テキスト系 Widget で発生 */
    public void textValueChanged(TextEvent te) {
        /* TextField, TextArea ウィジットに最初にテキストを追加した時にも
         発生する。これだけはキャンセルする。*/
        if( ++count > 2 ) {
            showDialog( "TextEvent: " + te );
        }
    }

    /* MyCanvas で発生 */
    public void mouseClicked(MouseEvent me) {
        showDialog( "MouseEvent: " + me );
    }

    /* あとのマウスイベントは何もしない */
    public void mouseEntered(MouseEvent me) {}
    public void mouseExited(MouseEvent me) {}
    public void mousePressed(MouseEvent me) {}
    public void mouseReleased(MouseEvent me) {}

    /* ウィンドウイベント */
    /* 終了ボックスをクリックすると終了 */
    public void windowClosing(WindowEvent e) { 
        System.exit( 0 );
    }

    /* 起動するとダイアログを開く */
    public void windowOpened(WindowEvent e) {
        showDialog( "WindowEvent: " + e );
    }

    /* アイコン化されるとダイアログを開く */
    public void windowIconified(WindowEvent e) {
        showDialog( "WindowEvent: " + e );
    }

    /* アイコン化から戻るとダイアログを開く */
    public void windowDeiconified(WindowEvent e) {
        showDialog( "WindowEvent: " + e );
    }

    /* あとはうっとおしいので何もしない */
    public void windowClosed(WindowEvent e) {}
    public void windowActivated(WindowEvent e) {}
    public void windowDeactivated(WindowEvent e) {}
}




MyCanvas.java

Canvas クラスを拡張し、マウスをクリックすると赤い点を描くなどの処理をする。カスタム部品クラスである。

import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class MyCanvas extends Canvas implements MouseListener {
    Dimension size;  /* Widget のサイズ */
    Vector points;   /* クリックされた点を保存 */

    public MyCanvas( int w, int h ) {
        size = new Dimension( w, h );
        points = new Vector();
    }

    /* キャンバスのサイズをレイアウトマネージャに伝える。 */
    public Dimension getPreferredSize( ) {
        return size;
    }

    public Dimension getMinimumSize( ) {
        return size;
    }

    /* 点を描く */
    public void paint( Graphics g ) {
        for( int i = 0; i < points.size(); i++ ) {
            Point at = (Point)points.elementAt(i);
            g.fillArc( at.x - 3, at.y - 3, 6, 6, 0, 360 );
        }
    }

    /* マウスがクリックされた時に、その位置を保存しておく */
    public void mouseClicked(MouseEvent me) {
        Point at = new Point( me.getX(), me.getY() );
        points.add( at );
        repaint();
    }

    /* あとのマウスイベントは何もしない */
    public void mouseEntered(MouseEvent me) {}
    public void mouseExited(MouseEvent me) {}
    public void mousePressed(MouseEvent me) {}
    public void mouseReleased(MouseEvent me) {}
}



MyDialog.java

イベントが生じた時に、モーダルダイアログボックスを開き、どんなイベントかを通知する。このクラスは MyAdaptor クラスからのみ呼ばれる。

import java.awt.*;
import java.awt.event.*;

public class MyDialog implements ActionListener {
    Dialog dialog;  /* Dialog クラスへのアダプタとして作る */
    Point at;       /* 上位ウィンドウの位置 */
    TextArea ta;    /* イベント種類の表示エリア */

    public MyDialog( String s, Container c ) {
        /* 上位レベルが Frame(==スタンドアロン)ならば、それをダイアログの
           親ウィンドウとし、Applet(==アプレット)ならば、Frame を持たない
           ので、新たに Frame クラスを作る。 */
        if( c instanceof Frame ) {
            dialog = new Dialog( (Frame)c, true );
        } else {
            dialog = new Dialog( new Frame(), true );
        }
        at = c.getLocation(); /* 親の位置を保存しておく */

        dialog.setBackground( Color.white );  /* 背景色のセット */
        dialog.setTitle( "Dialog Sample" );   /* タイトルのセット */

        /* 以降はダイアログの中身の設定 */
        Label lab1 = new Label( s );
        ta = new TextArea( "", 7, 50, TextArea.SCROLLBARS_VERTICAL_ONLY );
        ta.setEditable( false );
        Button but = new Button( "OK" );
        
        /* ダイアログの中身をレイアウト */
        dialog.setLayout( new BorderLayout() );
        dialog.add( "North", lab1 );
        dialog.add( "Center", ta );
        dialog.add( "South", but );

        /* 確認ボタンで発生するアクションイベントを監視 */
        but.addActionListener( this );
    }

    /* イベント種別を表示エリアにセットし、レイアウトを確定する */
    public void setString( String s ) {
        ta.append( s );
        dialog.pack();
    }

    /* ダイアログを表示する。親ウィンドウの相対位置で表示 */
    public void show( ) {
        dialog.setLocation( at.x + 50, at.y + 100 );
        dialog.show( );
    }

    /* 確認ボタンが押されたら、ダイアログを破棄 */
    public void actionPerformed( ActionEvent ae ) {
        dialog.dispose();
    }
}





copyright by K.Sugiura, 1996-2006