JavaのGUI

  1. GUIとは

     
    1. GUI
      GUI:Graphic User Interface はスクリーンの一部に枠を作成し、その中に、メニューやボタンなどの指示部品、編集可能な文字枠、グラフィックによる描画機能を提供します。最近のほとんどのコンピュータシステムに組み込まれているインターフェース機能です。

    2. AWT
       JavaのGUI機能を提供するのがAWT:Absrtact Tool Kit で、java.awt パッケージとして組み込まれています。Java1.2以後はAWTを発展させたSWINGがよく利用されますが、基本的なGUIとしてAWTはよく利用されています。

    3. イベント
       AWTは主に表示(グラフィック)の部分を扱います。GUI にはグラフィック表示以外に、マウスやキーボードなど、利用者からの入力を受け取る機構が必要です。これらの入力はまず、OS(Windows)システムで管理され、対応するウインドウの管理プログラムに渡されます。
       Javaではこの対話入力を各種の「イベント」 として受け取ります。イベントを処理し、その結果をグラフィックスで表示することで、GUI が機能します。
       
  2. フレームクラスとグラフィックス

    1. フレームクラス
       アプリケーションでウインドウを作成するには、Frameクラスを拡張したクラスを作成します。次の例では、newFrameクラスを定義しています。コンストラクタで setSize(200, 150); でフレームのサイズを定めています。
       mainでは、newFrame() のインスタンス nf を作成し、nf.show() で可視(実際に表示)にしています。

      public class gFrame extends Frame {
      
        public static void main(String[] args) {
          newFrame nf = new newFrame();
          nf.show();
        }
      }
      
      class newFrame extends Frame {
        
        newFrame() {
          setSize(200, 150);
        }
      }
      
      }
       これを実行すると、次のようなウインドウが出現します。
       


    2. イベント処理
       ただし、このままでは、イベントに対応していませんから、ウインドウを閉じることが出来ません。ウインドウを閉じるには、メニューバーにある xボタン に対応するイベント処理が必要です。

       このイベント処理に対応した、newFrame を以下に紹介します。ウインドウのクローズ処理は、WindowAdapterクラスの、windowClosing()が処理をします。ここでは、System.exit(0); で終了処理をします。このクラスのインスタンスを、addWindowListener() で、newFrame クラスに追加し、イベント処理を行います。ここでの、処理は「無名インナクラス」と呼ばれます。
       これで、タイトルバーによるウインドウのクローズ処理が可能になります。
      class newFrame extends Frame {
      
        newFrame() {
          setSize(200, 150);
      
          addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent evt) {
              System.exit(0); //終了イベント
            }
          });
        }
      
        public void paint(Graphics g) {
          g.drawString("Hello", 30, 100); //グラフィック表示
        }
      
      }

    3. グラフィック処理
      上記のnewFrameクラスに、以下のメソッドを追記すると、ウインドウにグラフィックスを描画することができます。g.drawString("Hello", 30, 100); は文字列 "Hello" を (30,100) の座標から表示します。
       g.drawLine(0,0,200,150); は (0,0)から(200,150)まで、直線を描画するメソッドです。座業(0,0)はウインドウの左上の角の座標で、ここからタイトルバーも表示されています。
         public void paint(Graphics g) {
          g.drawString("Hello", 30, 100); //グラフィック表示
          g.drawLine(0,0,200,150);
        }


    4. マウス位置の取得と円の表示
       先の例をマウス位置による対話的な描画を行う、簡単な例を紹介します。main() は同じです。Frameを継承した mFrame で、マウスのイベント処理を行うマウスリスナを組み込みます。addMouseListener() では、マウスボタンを押したとき実行される、this_mousePressed(e); メソッドを定義しています。

       this_mousePressed(MouseEvent e)は、マウスボタンが押されると呼び出されるメソッドで、引数e にマウスイベントの情報が記録されています。e.getPoint() でマウスの位置を mpos に取得します。mpos は Point クラスのインスタンスで、mpos.x でmpos のx座標を取り出すことができます。このメソッドの最後に、repaint() メソッドを呼び出しています。これは、ウインドウを再描画することを指示します。
       repaint() により、paint() が間接的に実行されます。これは、g.drawOval() を呼び出し、マウスの位置を中心に、直径20の円を表示します。

         g.drawOval(x,y, 20, 20);

      import java.awt.*;
      import java.awt.event.*;
      
      public class MouseFrame {
        public static void main(String[] args) {
          mFrame nf = new mFrame();
          nf.show();
        }
      }
      
      class mFrame extends Frame {
        Point mpos = new Point(0, 0);
      
        mFrame() {
          setSize(200, 150);
      
          addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent evt) {
              System.exit(0); //終了イベント
            }
          });
      
          //マウスリスナの定義
          addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(MouseEvent e) {
              this_mousePressed(e);
            }
          });
        }
      
        public void paint(Graphics g) {
          g.drawOval(mpos.x - 10, mpos.y - 10, 20, 20);
          //System.out.println(mpos);
        }
      
        void this_mousePressed(MouseEvent e) {
          mpos = e.getPoint();
          repaint();
        }
      
      }


    5. GUI部品
       グラフィックスに機能と、イベント処理機構を利用すると、GUIを行う各種の「部品」を制作できます。マウスでクリックすると対応する処理を行うボタンや、編集出来る文字枠、等です。
      これらの部品については、別の項目で紹介します。