#acl All: == ウインドウの内容 == 窓は窓枠と窓ガラスでできています。 . {{attachment:swing04.png}} 窓枠に対応するのがJFrameです。 窓ガラスがはまる部分に処理内容に対応した部品を配置し、処理を記述します。 {{{#!java import javax.swing.*; import java.awt.*; public class Sample3 { public static void main(String[] args) { JFrame f; Container cp; JPanel p; f = new JFrame(); f.setVisible(true); f.setTitle("swing"); f.setSize(200, 300); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); cp = f.getContentPane(); p = new JPanel(); cp.add(p); } } }}} 枠の内側で部品を配置できる場所を!ContentPaneと呼び、クラスはContainerです。 ここにaddメソッドを用いて部品を配置します。 このプログラムでは基本的な部品であるJPanelを配置しています。 Containerがjava.awtパッケージのクラスなのでimport文が増えています。 . {{attachment:swing05.png}} ---- === 描画 === GUIではプログラムの実行開始時にだけ、ウインドウ内部が描画されるわけではありません。 ウインドウの大きさが変えられたり、ボタンが押されたり、文字が入力されたり など、いろいろな場面で描画が行われます。 JPanel上の描画が必要になったときには、JPanelクラスの paintComponentメソッドが実行されます。 JPanelクラスのpaintComponentメソッドではプログラムで表示内容を指定できません。 JPanelクラスを継承してサブクラスを作成し、paintComponentメソッドを記述します。 . {{attachment:swing06.png}} サブクラス名を Lesson10 とした例を示します。 {{{#!java import javax.swing.*; import java.awt.*; public class Lesson10 extends JPanel { public void paintComponent(Graphics g) { g.drawRect(50,50,100,150); } } }}} paintComponentの説明 ---- 上のサンプルプログラムSample3でJPanelとなっていた箇所を、 このクラス(Lesson10)で置き換えます。 {{{ public static void main(String[] args) { ... Lesson10 p; ... p = new Lesson10(); ... } }}} するとContainerに配置されるのはLesson10クラスのインスタンスとなり、 描画が必要なときにはLesson10クラスのpaintComponentが実行されます。 Sample3.javaとLesson10.javaを作成、コンパイルし . > java Sample3 で実行できます。 Lesson10クラスのmainメソッドとして同じものを記述すれば Lesson10.javaだけを作成、コンパイルし . > java Lesson10 で実行できます。 {{{ public class Lesson10 extends JPanel { void paintComponent(...) { ... } publlic static void main(...) { ... } } }}}