s
home preface menu sample sample links contact gallery
s
s 3 基本の応用
s 3.1 GUI(Graphical User Interface)
s 3.1.1 コンテナ(container)、部品(component)
 コマンドプロンプトからの入出力操作では殺風景でであり操作しづらいのでフレーム(frame)をとおしてラベル、ボタン、テキストボックス、チェックボックスなどのGUIコンポーネント部品やグラフィックスの表示がAWT(Abstract Window Tool kit)とSwingとして用意されています。
 SwingはAWTをベースに軽量化してや、種類の違うコンピュータの表示により高い共通性もたせています。Swingで使用されるGUI部品(Component)はすべてContainerクラスのサブクラスです。 他の部品のコンテナとして利用するクラスと直接ユーザーの入力を処理するクラスがあります。
 Swingの他部品のコンテナ(container)としてはJFrame、JWindow、JPanelなどがあります。JFrameはアプリケーションの表示フレームです。JFrameをトップレベルコンテナ、JPanelを中間コンテナといいます。
 JFrame、JWindowはさらに内部にJRootPaneクラスというコンテナを持っています。 JRootPaneの内部にmenuBar(オプション)やcontentPaneという構造があります。
 contentPaneオブジェクトは部品componentの配置を決めて収容してJFrameに貼り付けます。SwingではJFrame へは必ずcontentPaneをかいしてcomponentを貼り付けなければなりません。 conentPaneに直接componentを貼り付けることができますが、JPanelにcomponentを配置してcontentPaneに貼り付けるほうがフレキシビリティがあります。
 contentPaneオブジェクトを得るには、JFrameのオブジェクトobj_jframeからJframeクラスのgetContentPane()メソッドを使って取得します。
  Container obj_contentPane = obj_jframe.getContentPane();
 JRootPaneについてすこし細かくみてみると、単独ではオブジェクトを作らず、JFrame、JDialog、JWindow、JAppletのトップレベルコンテナはRootPaneContainerインターフェイスを実装し、処理をJRootPaneに委譲します。 JRootPaneはglassPane、menuBar(オプション)contentPaneからなります。(JLayeredPaneはmenuBarとcontentPaneを glassPaneは一番上の前面にあってマウスの動きを捕捉します。ディフォルトで非可視ですがsetVisible()メソッドで表示制御できます。
 JpanelにContainerクラスのsetLayout(LayoutManager mgr )メソッドを使って部品(componennt)の配置を設定します。引数はLayoutManagerインターフェースimplementした各Layoutクラスオブジェクト生成します。JPanelはJFrameにcontentPaneを使って貼り付けます。
 基本部品の主なものは
JButton 操作指示のボタン
JCheckbox 項目を選択するチェックボックス
JRadioButton 項目を選択するラジオボタン
JList 複数の項目から選択するリスト
JLabel 文字を表示する領域
JTextField 1行の文字を入力する領域
JTextArea 複数行の文字を入力編集する領域
 表3-1 Swing基本部品クラス
container
 図3-1 コンテナ
 contentPaneやJPanelへの配置はLayoutManagerインターフェースを実装した各Layoutクラスのオブジェクトで決めます。
BorderLayout 東西南北中央の区画に並べる
FlowLayout 順に部品を列に並べる
CardLayout 重ねて部品を表示して選択できる
GridLayout グリッドの行と列に順に並べる
GridBagLayout グリッドを使ってサイズを自由に変えて並べる
 表3-2 各Layoutクラス

s 3.1.2 イベント(event)処理
 JButtonなどのコンポーネントを配置しただけでは操作による処理は実行されませんのでイベントの処理を考えます。
 イベントソースオブジェクトのコンポーネントになんらかの操作が加わり状態が変化したときActionEventなどのイベントオブジェクトが生成されると考えます。イベントオブジェクトはイベントを発生させたイベントソース、イベントタイプID、コマンドなどの属性情報を持っています。
 Jbuttonなどのイベントオブジェクトを受け取って処理を行うのは、イベントソースオブジェクトではなくActionListenerなどのイベントリスナオブジェクトを生成してそのオブジェクトがイベントオブジェクトを受け取ります。 
 このイベントリスナオブジェクトがイベントオブジェクトを受け取ったときイベントリスナインターフェースのactioPerformed()などの
 メソッドをオーバーライドしたメソッドが処理対象オブジェクトへの処理を行うと考えます。 イベントリスナオブジェクトはイベントソースオブジェクトに貼り付けられます。
action
 図3.1-2 イベント処理の例

s 3.2 イベント処理の実際
 イベント処理の例として、ボタンが押されたら「ボタンが押されました」と表示するプログラムについてみてみます。コンポーネントを変えれば応用ができます。
001  //java EventTest
002  import java.awt.*;
003  import java.awt.event.*;
004  import javax.swing.*;
007  class EventTest extends JPanel{
008    JButton obutton;
009    JLabel olabel;
010    EventTest(){
011      obutton=new JButton("PUSH");
012      olabel=new JLabel();
013      EvListener olistener=new EvListener();
014      obutton.addActionListener(olistener);
015      this.setLayout(new GridLayout(2,1));
016      this.add(obutton);
017      this.add(olabel);
018    }
019    public static void main(String args[]){
020      JFrame oframe=new JFrame("EventTest");
021      JPanel oexpanel=new EventTest();
022      Container ocontentp=oframe.getContentPane();
023      ocontentp.add(oexpanel);
024      oframe.setBounds( 10, 10, 200, 100);
025      oframe.setVisible(true);
026      oframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
027    }
028    class EvListener implements ActionListener{
029      public void actionPerformed(ActionEvent oevent){
030      olabel.setText("ボタンが押されました");
031      olabel.setHorizontalAlignment(JLabel.CENTER);
032      }
033    }
034  }
 無名クラスにした場合
013   obutton.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent oevent){
          olabel.setText("ボタンが押されました");
          olabel.setHorizontalAlignment(JLabel.CENTER);
        }
014   });
R028-033は削除
 実行結果
event
  1. JFrameクラスなどを使用するためにjavaクラスライブラリからパッケージにクラスをインポートします。*はワイルドカードで対象javaコアパッケージ内のどのクラスにもアクセスできます。java.langパッケージは自動的にインポートされますので明示する必要はありません。(R002-004)
  2. コマンドラインからjava EventTestを実行するとmain( )メソッドが参照されます。JFrameクラスのオブジェクトoframeが、タイトルとして”EventTest” を引数として渡しながら生成されます。(R019-020)
  3. JPanelクラスを継承拡張したEventTestクラスのオブジェクトoexpanelを生成してコンストラクタで初期化します。(R021,R010)
  4. フィールドのJButtonクラスのオブジェクトobuttonを表示”PUSH”を引数として渡しながら生成初期化します。同様にJLabelクラスのオブジェクトolabelを生成初期化します。(R011-012)
  5. ActionListnerインターフェースを継承したEvListnerクラスのオブジェクトolistenerを生成初期化します。olistenrオブジェクトのメソッソッドactionPerformedはイベントソースのobuttonオブジェクトがActionを受け取ボタン操作されるとActionEventクラスのオブジェクトoeventが生成されそれを引数として渡されてactionPerformed( )メソッドがオーバーライド処理のolabelに”ボタンが押されました”をラベルの左右中央に配置表示します。olistenerオブジェクトをobuttonnに貼り付けておきます。(R013-014,R029-031)
  6. EvEventクラスのオブジェクトoexpanelにGridLayoutクラスのオブジェクト(無名)を2行1列で生成して貼り付けます。obuttonとolabelを貼り付けます。(R015-017)
  7. mainメソッドに帰ってoframeオブジェクトのcontentPaneオブジェクトをgetContentPane( )メソッドで取得して生成します。(R022)
  8. ocontentpオブジェクトにoexpanelオブジェクトをadd( )メソッドで貼り付けます。(R023)
  9. oframeオブジェクトに位置、横と縦大きさ属性をpixcel単位でsetBound( )メソッドを使って設定します。(R024)
  10. oframeオブジェクトをsetVisivble( )メソッドで可視に設定します。(R025)
  11. oframeオブジェクトのcloseボタンを押されたときoframeオブジェクトを閉じてアプリケーションを終了します。(R026)

s 3.3 描画(drawing)
 GUIはコンポーネントを配置するだけでなく、コンポーネントに描画することもできます。 マウスで楕円を描画するプログラムを考えます。 実行結果はsample2プログラムのAppletでみることができます。 Graphicsクラスは抽象クラス(abstract)でOSに依存するメソッドはabstractメソッドとして持っていて、コンポーネント、描画領域、カラー、描画モードなどの情報を管理しています。
001  //java GrDraw
002  import java.awt.event.*;
003  import javax.swing.*;
004  import java.awt.*;
005  public class GrDraw extends JPanel
006          implements MouseListener,MouseMotionListener{
007    int x1,y1;
008    public GrDraw(){
009      this.addMouseListener(this);
010      this.addMouseMotionListener(this);
011    }
012    public void mouseDragged(MouseEvent ome){
013      int x0,y0,x2,y2;
014      Graphics ogr=this.getGraphics();
015      ogr.clearRect(0,0,300,300);
016      x2=ome.getX();
017      y2=ome.getY();
018      if(x1>=x2){x0=x2;x2=x1;} else x0=x1;
019      if(y1>=y2){y0=y2;y2=y1;} else y0=y1;
020      ogr.drawOval(x0, y0, x2-x0, y2-y0);
021    }
022    public void mouseMoved(MouseEvent ome){}
023    public void mousePressed(MouseEvent ome){
024      x1=ome.getX();
025      y1=ome.getY();
026    }
027    public void mouseReleased(MouseEvent ome){}
028    public void mouseEntered(MouseEvent ome){}
029    public void mouseExited(MouseEvent ome){}
030    public void mouseClicked(MouseEvent ome){}
031    public static void main(String args[]){
032      JFrame oframe=new JFrame();
033      oframe.getContentPane().add(new GrDraw());
034      oframe.setBounds(10, 10, 300, 300);
035      oframe.setVisible(true);
036      oframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
037    }
038  }
  1. javaクラスライブラリからJFrameクラス、MouseListenerインターフェースなどをパッケージにインポート(import)して継承、実装して利用でるようにします。 *はワイルドカードで各javaコアパッケージに所属するクラスがどれでも使えます。(R002-R004)
  2. GrDraw.classクラスをコマンドプロンプトからjava GrDrawで実行すると、クラスメソッドのmain()メソッドが最初に参照されます。(R031)
  3. JFrameクラスのoframeオブジェクトを生成して初期化します。(R032)
  4. JPanelクラス、MouseListenerインターフェースとMouseMotionListenerインターフェースを継承、実装したGrDrawクラスのオブジェクト(無名new GrDraw())を生成して、oframeオブジェクトから取得したcontentpaneオブジェクト(無名)に貼り付けます。(R033)
  5. 生成したJpanelクラスを継承したGrDrawクラスのオブジェクト(無名)をコンストラクタに引数thisとして渡してGrDrawのオブジェクト(無名)thisにMouseListenerオブジェクト(無名)とMouseMotionListenerオブジェクト(無名)をそれぞれ貼り付けて初期化します。(R008-R011)
  6. 貼り付けたMouseListenerオブジェクトはマウスへのイベントが行われるとMouseEventクラスのオブジェクトomeが発生してそれを引数としてmouseDragged()をオーバーラード
  7. oframeオブジェクトにsetBounds( )Iメソッドで位置と大きさ属性を追加します。(R034)
  8. oframeオブジェクトをsetVisible()メソッドで可視状態にします。(R035)
  9. oframeオブジェクトのCloseボタンを押したときアプリケーションが終了するようにします。(R036)
  10. MouseListenerインターフェースとMouseMotionListenerインターフェースのabstractメソッドをJpanelとを継承したGrDrawクラスですべてオーバーライドして実装します。(R15-R33)
  11. 実装内容はマウスがクリックされたとき発生したMouseEventクラスのomeオブジェクトを取得して、mousePressed()メソッドの処理内容として位置x1とy1を取得処理をオーバーライド実装します。(R023-R026)
  12. マウスがドラッグされている間Graphicsクラスのogrオブジェクトを取得して、clearRect( )メソッドで前の画像を消してからマウス位置x2とy2を取得しながらdrawOval( )メソッドで新たな楕円画像を描画していきます。(R012-R021)

s
index previous page top next