welcome: please sign in
location: "ウインドウの内容"の差分
17と33のリビジョン間の差分 (その間の編集: 16回)
2009-11-27 07:29:33時点のリビジョン17
サイズ: 3092
編集者: masahiko
コメント:
2010-12-13 02:37:40時点のリビジョン33
サイズ: 5296
編集者: masahiko
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 1: 行 1:
#acl All:
行 7: 行 6:
窓ガラスがはまる部分に処理内容に対応した部品を配置し、処理を記述します。 窓ガラスがはまる部分に処理内容に対応した部品を配置し、配置したインスタンスを通して処理を行います。
部品にはボタンやメニューなどもあります。

----
=== 部品の配置 ===
 このプログラムでは基本的な部品であるJPanelを配置しています。
行 32: 行 36:
JFrame, Container, JPanelの3つのクラスを利用しています。
 . JFrame, JPanelは javax.swingパッケージに含まれます。
 . Containerはjava.awtパッケージに含まれます。
 . これらを利用するためimport文が2行あります。

12~16行目はウインドウ枠の処理です。[[ウインドウの表示]]を参照。
行 33: 行 44:
 . 18行目 cp = f.getContentPane();
   . JFrameインスタンスfの!ContentPaneを得て、変数cpに記憶しておきます。
 . 19行目 p = new JPanel();
   . 配置したいJPanelインスタンスを作成します。
 . 20行目 cp.add(p);
   . cpにaddメソッドを用いて部品pを配置します。
行 34: 行 51:
ここにaddメソッドを用いて部品を配置します。 この結果インスタンスの状態はこのようになります。
 . {{attachment:swing05.png}}
行 36: 行 54:
このプログラムでは基本的な部品であるJPanelを配置しています。

Containerがjava.awtパッケージのクラスなのでimport文が増えています。

 . {{attachment:swing05.png}}
'''注'''
 . java1.5以降ではcpを使わずにf.add(p)と書けるようですが、JFrameにJPanelがaddされるわけではなく、上と同様の処理が行われます。
行 48: 行 63:
JPanel上の描画が必要になったときには、JPanelクラスの
paintComponentメソッドが実行されます。
 . JPanel上の'''描画が必要になったとき'''には、JPanelクラスの'''paintComponent'''メソッドが実行されます。
行 53: 行 67:
JPanelクラスを継承してサブクラスを作成し、paintComponentメソッドを記述します。  . JPanelクラスを継承して'''サブクラスを作成'''し、paintComponentメソッドを記述します。
行 57: 行 71:
サブクラス名を Lesson10 とした例を示します。 サブクラス名を Sample4 とした例を示します。
行 62: 行 76:
 public class Lesson10 extends JPanel  public class Sample4 extends JPanel
行 70: 行 84:
paintComponentは引数としてGraphicsクラスの paintComponentは引数としてGraphicsクラスのインスタンスをとります。
この例では変数名をgとしています。

描画はインスタンスgに対してメソッドを使って指示します。

drawRectは長方形を描くメソッドです。
引数は左上のx座標,y座標,横幅,縦幅です。

座標系は図のとおりです。
 . {{attachment:zahyo.png}}
行 74: 行 97:
このクラス(Lesson10)で置き換えます。 このクラス(Sample4)で置き換えます。
行 79: 行 102:
  Lesson10 p;   Sample4 p;
行 81: 行 104:
  p = new Lesson10();   p = new Sample4();
行 85: 行 108:
するとContainerに配置されるのはLesson10クラスのインスタンスとなり、
描画が必要なときにはLesson10クラスのpaintComponentが実行されます。
するとContainerに配置されるのはSample4クラスのインスタンスとなり、
描画が必要なときにはSample4クラスのpaintComponentが実行されます。
行 88: 行 111:
Sample3.javaとLesson10.javaを作成、コンパイルし 変数宣言は
  JPanel p;
のままでもかまいません。理由は継承のところで説明しました。
----
=== mainメソッドをどこに記述するか ===

mainメソッドは特殊なメソッドで、どのクラス内に記述するかはあまり意味を持ちません。

コマンド
 >java クラス名
を行うと、そのクラス内のmainメソッドが実行されるだけです。

クラスの機能は普通のメソッドとして記述し、
mainメソッドは主として動作確認のために使ってきました。

'''例1'''

上のサンプルではSample4.javaでクラスを定義し、
Sample3.javaにSample4クラスを利用するmainメソッドを記述しています。

この場合、コンパイル後
行 91: 行 134:
----
コンパイルは2つのファイルを別々に行っても良いし、
mainメソッドのあるSample3.javaをコンパイルすれば一緒にコンパイルされます。

'''例2'''
行 93: 行 141:
Lesson10クラス内に記述すれば
Lesson10.javaだけを作成、コンパイルし
 . > java Lesson10
Sample4クラス内に記述すれば
Sample4.javaだけを作成、コンパイルし
 . > java Sample4
行 99: 行 147:
 public class Lesson10 extends JPanel  public class Sample4 extends JPanel

ウインドウの内容

窓は窓枠と窓ガラスでできています。

  • swing04.png

窓枠に対応するのがJFrameです。

窓ガラスがはまる部分に処理内容に対応した部品を配置し、配置したインスタンスを通して処理を行います。 部品にはボタンやメニューなどもあります。


部品の配置

  • このプログラムでは基本的な部品であるJPanelを配置しています。
       1  import javax.swing.*;
       2  import java.awt.*;
       3  
       4  public class Sample3
       5  {
       6         public static void main(String[] args)
       7         {
       8                 JFrame f;
       9                 Container cp;
      10                 JPanel p;
      11                 
      12                 f = new JFrame();
      13                 f.setVisible(true);
      14                 f.setTitle("swing");
      15                 f.setSize(200, 300);
      16                 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      17                 cp = f.getContentPane();
      18                 p = new JPanel();
      19                 cp.add(p);
      20         }
      21  }
    

JFrame, Container, JPanelの3つのクラスを利用しています。

  • JFrame, JPanelは javax.swingパッケージに含まれます。
  • Containerはjava.awtパッケージに含まれます。
  • これらを利用するためimport文が2行あります。

12~16行目はウインドウ枠の処理です。ウインドウの表示を参照。

枠の内側で部品を配置できる場所をContentPaneと呼び、クラスはContainerです。

  • 18行目 cp = f.getContentPane();
    • JFrameインスタンスfのContentPaneを得て、変数cpに記憶しておきます。

  • 19行目 p = new JPanel();
    • 配置したいJPanelインスタンスを作成します。
  • 20行目 cp.add(p);
    • cpにaddメソッドを用いて部品pを配置します。

この結果インスタンスの状態はこのようになります。

  • swing05.png

  • java1.5以降ではcpを使わずにf.add(p)と書けるようですが、JFrameにJPanelがaddされるわけではなく、上と同様の処理が行われます。


描画

GUIではプログラムの実行開始時にだけ、ウインドウ内部が描画されるわけではありません。

ウインドウの大きさが変えられたり、ボタンが押されたり、文字が入力されたり など、いろいろな場面で描画が行われます。

  • JPanel上の描画が必要になったときには、JPanelクラスのpaintComponentメソッドが実行されます。

JPanelクラスのpaintComponentメソッドではプログラムで表示内容を指定できません。

  • JPanelクラスを継承してサブクラスを作成し、paintComponentメソッドを記述します。

  • swing06.png

サブクラス名を Sample4 とした例を示します。

  •    1  import javax.swing.*;
       2  import java.awt.*;
       3  
       4  public class Sample4 extends JPanel
       5  {
       6         public void paintComponent(Graphics g)
       7         {
       8                 g.drawRect(50,50,100,150);
       9         }
      10  }
    

paintComponentは引数としてGraphicsクラスのインスタンスをとります。 この例では変数名をgとしています。

描画はインスタンスgに対してメソッドを使って指示します。

drawRectは長方形を描くメソッドです。 引数は左上のx座標,y座標,横幅,縦幅です。

座標系は図のとおりです。

  • zahyo.png


上のサンプルプログラムSample3でJPanelとなっていた箇所を、 このクラス(Sample4)で置き換えます。

  •  public static void main(String[] args)
     {
            ...
            Sample4 p;      
            ...
            p = new Sample4();
            ...
     }

するとContainerに配置されるのはSample4クラスのインスタンスとなり、 描画が必要なときにはSample4クラスのpaintComponentが実行されます。

変数宣言は

  • JPanel p;

のままでもかまいません。理由は継承のところで説明しました。


mainメソッドをどこに記述するか

mainメソッドは特殊なメソッドで、どのクラス内に記述するかはあまり意味を持ちません。

コマンド

  • >java クラス名

を行うと、そのクラス内のmainメソッドが実行されるだけです。

クラスの機能は普通のメソッドとして記述し、 mainメソッドは主として動作確認のために使ってきました。

例1

上のサンプルではSample4.javaでクラスを定義し、 Sample3.javaにSample4クラスを利用するmainメソッドを記述しています。

この場合、コンパイル後

  • > java Sample3

で実行できます。

コンパイルは2つのファイルを別々に行っても良いし、 mainメソッドのあるSample3.javaをコンパイルすれば一緒にコンパイルされます。

例2

ウインドウを作成し表示するためのmainメソッドを、 Sample4クラス内に記述すれば Sample4.javaだけを作成、コンパイルし

  • > java Sample4

で実行できます。(プログラムは1つのファイルで済みます)

  •  public class Sample4 extends JPanel
     {
            void paintComponent(...)
            {
                    ...
            }
     
            public static void main(...)
            {
                    ...
            }
     }

ウインドウの内容 (最終更新日時 2010-12-13 02:46:25 更新者 masahiko)