イベント::
イベント::
イベント::
イベント:: イベント処理により状態変化した内容の表すオブジェクト
オブジェクト
オブジェクト
オブジェクト(クラスは EventObject のサブクラス)
((((イベント
イベント
イベント))))ソース::
イベント
ソース::
ソース::
ソース::
イベントを生成するオブジェクト
イベントを生成するオブジェクト
イベントを生成するオブジェクト
イベントを生成するオブジェクト(GUI のコンポーネントのオブジェクトなど)
((((イベント
イベント
イベント))))リスナー::
イベント
リスナー::
リスナー::
リスナー:: イベントを受け取り,処理を行なうオブジェクト
処理を行なうオブジェクト
処理を行なうオブジェクト
処理を行なうオブジェクト
[ 注意点 ] イベントおよびソース ・ イベントはオブジェクトとして渡される ・ イベントのクラスはアクションの内容によって異なる (ボタンをクリック,テキストを変更など) ・ イベントクラスは java.awt.event パッケージに含まれる(プログラム作成時に import が必要) リスナー ・ イベントリスナーはイベント(の内容,クラス)によって予め決まっている ・ イベントリスナーはインターフェースとして定義されている応用プログラミング
-イベント処理-
イベント:
プログラムへの働きかけ
(GUI のボタンをクリックする,キーボードよりデータを入力するなど)
イベント処理
(イベントハンドリング): イベントに対する応答及びそのプログラム処理
→ イベントを処理するプログラムは“イベントが発生した場合にの
み”呼び出される (イベントドリブン)
GUI
イベント処理の
プログラム
イベント
イベント処理の概念図
①ボタンをクリック ②イベントが発生 ③イベントがイベント処理の プログラムに渡される ④プログラムがイベン トを受け取り処理する 処 を う 処理イベント処理の仕組みと流れ
イベントソース イベントソース イベントソース イベントソース (GUI) イベントリスナー イベントリスナー イベントリスナー イベントリスナー (イベントを処理する プログラム) イベント イベントイベント イベント (イベントオブジェクト)プログラム構成を含めた処理の流れ
②ソースにアクションを かける ③イベントが発生 ④イベントがリスナーに 渡される ⑤リスナーがイベントを 受け取り処理を行う ① リスナーをソースに 登録 処理プログラムの作成では以下の2点を行なう
① (イベント)リスナー側
クラスの定義とそのクラス内のメソッドに処理内容を記述
クラスの定義とそのクラス内のメソッドに処理内容を記述
クラスの定義とそのクラス内のメソッドに処理内容を記述
クラスの定義とそのクラス内のメソッドに処理内容を記述
(1)イベントを受け取るためにリスナーインターフェースの実装 :: ActionListner の実装など
(2)イベントの受け取り後の処理 ::
actionPerformed(ActionEvent e) など
※リスナーインターフェースはイベントの種類によって決められている (教科書
P150 表 12.1)
② (イベント)ソース側
リスナーの登録
リスナーの登録
リスナーの登録
リスナーの登録
ソースになるコンポーネント内にリスナーを登録 ::addActionListner(ActionListner e) など
(具体例) 教科書 P153 リスト 12.1
ボタンのクリック時に発生する ActionEvent の処理 (教科書 P153 リスト 12.1)
①に関する処理
(1) イベントリスナークラスを定義 L4
リスナーインターフェースを実装する (イベントに応じたリスナーインターフェースの利用)
( リスナークラスに ActionListner インターフェースを実装)
(2) イベント受け取り後の処理を定義 L18 ~25
ActionEvent が起こったときの振る舞いを actionPerformed メソッドに記述
②に関する処理
イベントリスナークラスの定義
(イベント)ソースになるコンポーネントにイベントリスナーを登録する. L11,12
(リスト 12.1 では ソースは 2 つのボタンであり,コンストラクタ内で登録する)教科書 P153 リスト 12.1 の処理の内容
GUI の作成とイベント処理用プログラムの追加
(1) コンポーネントのインポート (L1~3 )
L2
L2
L2
L2 がイベントコンポーネントのインポート
がイベントコンポーネントのインポート
がイベントコンポーネントのインポート
がイベントコンポーネントのインポート import
import
import
import java.awt.event
java.awt.event
java.awt.event.*
java.awt.event
.*
.*
.*
(2) イベントリスナーの実装によるサブクラスの作成
イベントリスナーの実装によるサブクラスの作成
イベントリスナーの実装によるサブクラスの作成
イベントリスナーの実装によるサブクラスの作成 (JPanel を継承, ActionListner を実装) L4~27
(3) コンストラクタ L7~17
GUI コンポーネントの設定(ラベルとボタンの設定) L8~10
イベントリスナーの登録(ボタンがソースのため,ボタンのオブジェクトのメソッドにより)
イベントリスナーの登録(ボタンがソースのため,ボタンのオブジェクトのメソッドにより)
イベントリスナーの登録(ボタンがソースのため,ボタンのオブジェクトのメソッドにより)
イベントリスナーの登録(ボタンがソースのため,ボタンのオブジェクトのメソッドにより)L11,12
GUI のレイアウト L13
コンポーネント(ボタンとラベル)を中間コンポーネント(自分のオブジェクト)に貼り付ける L14~16
(4) イベント処理メソッド(actionPerformed( ))の定義
L18~25
メソッドの引数に注意
(5) main メソッド (省略:GUI やグラフィックスの場合と同様)
Class MyListener implements ActionListener{ // ActionListener インターフェースの実装 ……
public void actionPerformed(ActionEvent e){ // ActionEvent の発生による処理の記述 ・・・…
} }
b1.addActionListener(this)
ButtonEvent1.java 1:/ ボタンの ActionEvent のサンプルプログラム 1 2: 3:import javax.swing.*; 4:import java.awt.*; 5:import java.awt.event.*; 6: 7:class ButtonEvent1 {
8: public static void main(String args[]) { 9: JFrame f = new JFrame("ButtonEvent1");
10: f.setDefaultCloseOperation(f.EXIT_ON_CLOSE); 11: Container c = f.getContentPane();
12: JButton b = new JButton("C l i c k !"); 13:
14: // イベントリスナーのインスタンスを作る 15: myListener1 ml = new myListener1( ); 16: 17: // ボタンにイベントリスナーを登録する 18: b.addActionListener(ml); 19: 20: c.add(b); 21: f.pack(); 22: f.setVisible(true); 23: } 24:} 25: 26:/* イベントリスナー「インタフェース」を実装して 27: イベントリスナー「クラス」を定義 */
28:class myListener1 implements ActionListener { 29:
30: /* イベント処理メソッドの定義 31: イベントリスナーインタフェースの 32: 抽象メソッドをオーバーライド */
33: public void actionPerformed(ActionEvent ae) { 34: System.out.println("ボタンがクリックされました"); 35: } 36:} 表示例 出力結果例 (「Click!」を2回押す) E:¥>java ButtonEvent1 ボタンがクリックされました ボタンがクリックされました
[ GUI 作成部分 ]
コ ン テン ト ペイ ン に
直接ボタンを貼り付
けていることに注意
ボタンの作成
登録のためにリスナーの
デフォルトコンストラクタを
呼んでいるオブジェクトを
作成
イベントクラスを呼び出すため
コンポーネントを import する
ActionListener イン ターフェースを実装イベント処理の内容を記述
イベント処理メソッド
(イベントによって予め 決まっている)イベントオブジェクト
(処理内容によって
予め決められている)
リスナークラスの定義
独立したリスナークラスの定義 イベントリスナーを自分とは別の独立したクラスにする. →独立性を持たせる
(欠点)リスナークラスが別のクラスとなると、ソース側のオブジェクトのフィールドをリスナー 側から直接操作できなくなる. ソース側のコンストラクタ部内でリスナーのオブジェクト(インスタンス)を生成させ る(イベントをソース内で渡せる) リスナークラス内ではソースのオブジェクトが渡される (例)リスナーのクラスとして,OutListener クラスを定義→
ActionListener
ActionListener
ActionListener
ActionListener インターフェースをインプリメントする
インターフェースをインプリメントする
インターフェースをインプリメントする
インターフェースをインプリメントする
(どんなクラスも ActionEvent のリスナーになれる) [ 応用 ] 下記のようにボタンが2つならば、①~③の変更を行う. 処理結果 ButtonA を2回,続いて ButtonB を押す場合 E:¥>java ButtonEvent2 Button A がクリックされました Button A がクリックされました Button B がクリックされました (変更点) ① 12行目に2つのボタンを設定 (例)JButton ba = new JButton("Button A"); JButton bb = new JButton("Button B");
② 18行目に2つの各ボタンに対して,イベントリスナーを登録 (例) ba.addActionListener(ml); bb.addActionListener(ml); ③ 34行目に各ボタンに対する処理を記述 (例)
String bname = ae.getActionCommand(); if(bname=="Button A") System.out.println("Button A がクリックされました"); else System.out.println(" Button B がクリックされました"); ソースクラス リスナーのオブジェクト リスナー クラス ソースのオブジェクト イベント処理{ ソースのオブジェクトを利用 }
リスナークラスの独立 1://HelloOut.java 2:// リスト 12.4 独立したリスナークラス(教科書 p162) 3:import java.awt.*; 4:import java.awt.event.*; 5:import javax.swing.*; 6:
7:class HelloOut extends JPanel{
8: JLabel label; //ラベル用の変数 9: JButton b1, b2; //ボタン用の変数 10: OutListener listener;
11: HelloOut(){
12: label = new JLabel(" "); //最初は何も表示しない 13: b1 = new JButton("ごあいさつ"); //ごあいさつボタン 14: b2 = new JButton("消去"); //消去ボタン 15:
16: listener = new OutListener(this);
17: b1.addActionListener(listener); //イベントリスナーを設定 18: b2.addActionListener(listener); //イベントリスナーを設定 19: 20: setLayout(new BorderLayout()); //配置方式の設定 21: add(label, BorderLayout.NORTH); //ラベルを置く 22: add(b1, BorderLayout.CENTER); //ボタンを置く 23: add(b2, BorderLayout.EAST); //ボタンを置く 24: } 25:
26: public static void main(String args[ ]){
27: HelloOut h = new HelloOut(); //HelloOut のオブジェクトを生成 28: JFrame frame = new JFrame(); //JFrame オブジェクトを生成 29: Container c = frame.getContentPane(); //フレームの内容表示域を得る
30: c.add(h, BorderLayout.CENTER); //フレームに HelloOut オブジェクトを置く 31: frame.pack(); //フレームを必要最小の大きさにする 32: frame.setVisible(true); //フレームを画面に見せる
33: } 34:} 35:
36:class OutListener implements ActionListener{ //イベントリスナー 37: HelloOut hello;
38: public OutListener(HelloOut h){ 39: hello = h;
40: } 41:
42: public void actionPerformed(ActionEvent e){
43: if(e.getSource() == hello.b1){ //b1 が押されたら 44: hello.label.setText("こんちには"); //label に文字列を設定 45: }else if(e.getSource() == hello.b2){ //b2 が押されたら 46: hello.label.setText(" "); //label の文字列を消す 47: } 48: } 49:}
イベントリスナー
コンストラクタ
[ イベントソース ]
GUI の作成
コンストラクタの引数にイベントソースのオブジェ クトを指定することで,イベントソースを取り込む. これにより,イベントソース(GUI)内のコンポー ネントにアクセスする イベントソースのオブジェクト のコンポーネントにアクセス イベントリスナーをソース内に 設定(イベントリスナーのコンス トラクターの呼び出し引数に自 分(オブジェクト)を設定) イベントリスナーの クラスのみにリスナ ーのインタフェース を実装リスナークラスの内部クラス化 1: // リスト 12.5 内部クラスとしてのリスナークラス (教科書 p163) 2:import java.awt.*; 3:import java.awt.event.*; 4:import javax.swing.*; 5:
6:class HelloIn extends JPanel{ 7: JLabel label; //ラベル用の変数 8: JButton b1, b2;//ボタン用の変数 9: InListener listener;
10: HelloIn(){
11: label = new JLabel(" "); //最初は何も表示しない 12: b1 = new JButton("ごあいさつ"); //ごあいさつボタン 13: b2 = new JButton("消去"); //消去ボタン
14:
15: listener = new InListener();
16: b1.addActionListener(listener); //イベントリスナーを設定 17: b2.addActionListener(listener); //イベントリスナーを設定 18: 19: setLayout(new BorderLayout()); //配置方式の設定 20: add(label, BorderLayout.NORTH); //ラベルを置く 21: add(b1, BorderLayout.CENTER); //ボタンを置く 22: add(b2, BorderLayout.EAST); //ボタンを置く 23: } 24:
25: class InListener implements ActionListener{ //イベントリスナー 26: public void actionPerformed(ActionEvent e){
27: if(e.getSource() == b1){ //b1 が押されたら 28: label.setText("こんちには"); //label に文字列を設定 29: }else if(e.getSource() == b2){ //b2 が押されたら 30: label.setText(" "); //label の文字列を消す 31: } 32: } 33: } 34:
35: public static void main(String args[]){
36: HelloIn h = new HelloIn(); //Hello のオブジェクトを生成 37: JFrame frame = new JFrame();//JFrame オブジェクトを生成
38: Container c = frame.getContentPane(); //フレームの内容表示域を得る 39: c.add(h, BorderLayout.CENTER);//フレームに Hello オブジェクトを置く 40: frame.pack(); //フレームを必要最小の大きさにする 41: frame.setVisible(true); //フレームを画面に見せる 42: } 43:} ―――――――――――――――――――――――――― 表示結果例
Hello.java, HelloOut.java, HelloIn.java 共通
“ごあいさつ”ボタンをクリック “消去”ボタンをクリック
イベントリスナー
コンストラクタ
[ イベントソース ]
GUI の作成
イベントリスナーをソース内に 設定(内部のクラスでもオブジ ェクトを作成し,そのオブジェ クトを登録する)HelloIn クラスのインスタンス変数と
して設定
(HelloIn クラス内の全クラス,
全メソッドで共通に利用できる)
InListener は HelloIn クラ スの内部なの で変 数 label をそのまま 指定 (this.label でも可) イ ベ ン ト リ ス ナ ー の ク ラ ス に ActionListner インターフェースを実 装(※この実装は HelloIn クラス自体 に 実 装 可 能 で あ る が , そ の 場 合 は InListener クラスの作成は不必要である. つまり,actionPerformed メソッドの定義の みで良い.これは Hello.java(リスト 12.1)と なる.アダプタークラス
リスナーインターフェースが複数のイベント処理メソッドを持つ場合
リスナーインターフェースを実装する場合,全てのメソッドを定義する必要がある.
(例:MouseListener インターフェースでは mousePressed( ), mouseReleased( ), mouseClicked( ), mouseEntered( ), mouseExited( ) の5つを定義する必要がある.) 必要なメソッドだけを定義する. アダプタークラスの利用 (例:MouseAdopter クラスを継承すると,必要なクラスのみ定義ればよい.インターフェースが1つの メソッドのみの場合はアダプタークラスの利用は意味が無い.) 1:// リスト 12.6 アダプターを使ったマウスリスナー(教科書 p164) 2:import java.awt.*; 3:import java.awt.event.*; 4:import javax.swing.*; 5:
6:class AdapterTest extends JPanel{ 7: int x1, y1, x2, y2;
8: AdapterTest(){
9: setBackground(Color.yellow);
10: setMinimumSize(new Dimension(250, 250)); 11: setPreferredSize(new Dimension(250, 250));
12: // addMouseListener(new MyMouse( )); //マウスリスナーを設定 13: MyMouse mm=new MyMouse(); //マウスリスナーを設定 14: addMouseListener(mm);
15: 16: } 17:
18: public void paintComponent(Graphics 19: super.paintComponent(g);
20: g.drawLine(x1,y1,x2,y2); 21: }
22:
23: class MyMouse extends MouseAdapter{ //内部リスナークラス
24: public void mousePressed(MouseEvent e){ //マウスを押した時の処理 25: x1 = e.getX();
26: y1 = e.getY(); 27: }
28: public void mouseReleased(MouseEvent e){ //マウスを離した時の処理 29: x2 = e.getX(); 30: y2 = e.getY(); 31: repaint(); //ボタンを離した時、図形を描く 32: } 33: } 34:
35: public static void main(String args[]){ 36: AdapterTest h = new AdapterTest(); 37: JFrame frame = new JFrame();
38: Container c = frame.getContentPane(); 39: c.add(h, BorderLayout.CENTER); 40: frame.pack(); 41: frame.setVisible(true); 42: } 43:} リスナークラスの設定 アダプタークラスの 継承 必要な2つのメソ ッドのみ定義 イ ベ ン ト リ ス ナ ー の 登 録 (MyMouse クラスのオブジェ クトを引数にして登録する) 12 もしくは 13&14 と記述す る (イベントリスナーを内部クラス として設定する場合と同様)
匿名内部クラス(無名インナークラス)
(特徴) ・ 名前を持たない内部クラス ・ クラスの定義とインスタンス(オブジェクト)の生成を一つに記述する (記述方法) new スーパークラス名(コンストラクタの引数){ 本体(各メソッド) }; (例) イベントリスナーでの設定class MyWindowListener extends WindowAdapter{ public void WindowCloseing(WindowEvent e){
System.exit(0); }
}
イベントソースでの設定 ~ イベントリスナーの登録 ~
JFrame f= new JFrame(“WindowDemo”);
f.addWindowListener(new MyWindowListener ( )); 無名インナークラスの利用 無名インナークラスの利用無名インナークラスの利用 無名インナークラスの利用 イベントソースでの設定 f.addWindowListener(new WindowAdapter ( ){
public void WindowCloseing(WindowEvent e){ System.exit(0); } });
一つにまとめる
リスナーのオブジェクトを登録 この部分に無名インナークラスの インスタンスを生成して登録 MyWindowListener の スーパークラス (これにより MyWindowListener クラスは記述しない) アダプタークラス イベントソース側の設定 ( マウスでの処理に利用) f.addMouseListener( new mouseAdapter( ){public void mousePressed(MouseEvent me){ setBackground(Color.red);
repaint( ); }
public void mouseReleased(MouseEvent me){ setBackground(Color.green); repaint( ); } }); メソッドの定義 アダプタークラス (本来、メソッドを定義する クラスのスーパークラス)
Timeクラスの利用によるアニメーション
Timeクラス: 任意の時間が経過した後にアクションイベントを発生させる機能を持つ (コンストラクタ,メソッドの内容は教科書 p169,170: start は頻繁に利用される) 一定時間後の処理に利用 (コンストラクタの引数として設定) Timeクラスを利用するアニメーション 複数のスレッドの利用(教科書 p145∼148 MediaTracker と Thread クラスの利用) Timer クラスの利用により、複数のスレッドを利用する必要が無い 一定の時間ごとに静止画を再描画(repaint)する 1:// リスト 12.7 Timer を使ったアニメーション (教科書 p170, 171) 2:import javax.swing.*; 3:import java.awt.*; 4:import java.awt.event.*; 5:6:class TimerAnimation extends JPanel implements ActionListener { 7: int number = -1; 8: int cell = 20; 9: int interval; 10: Image[] image; 11: MediaTracker tracker; 12: Timer timer; 13: 14: TimerAnimation() { 15: //イメージのロード
16: Toolkit toolkit = Toolkit.getDefaultToolkit(); 17: tracker = new MediaTracker(this);
18: image = new Image[cell]; 19: for (int i = 1; i <= cell; i++) { 20: image[i-1] = 21: toolkit.getImage("rabbit/rabbit" + i + ".gif"); 22: tracker.addImage(image[i-1], 0); 23: } 24: 25: interval = 150; //描画の間隔(ミリ秒) 26: timer = new Timer(interval, this); //タイマーの生成 27: timer.setInitialDelay(0); //すぐに始める 28: timer.setCoalesce(true); //イベントをまとめる 29: 30: setBackground(Color.white); //パネルの背景色 31: 32: tracker.waitForAll(); //ロードを開始 33: }catch(InterruptedException e){ return; }
34: startAnimation(); //アニメーションの開始 35: }
36:
37: public synchronized void startAnimation() { 38: if (!timer.isRunning()) {
39: timer.start(); //アニメーションの開始 40: }
41: } 42:
43: public synchronized void stopAnimation() { 44: if (timer.isRunning()) { 45: timer.stop(); //アニメーションを止める 46: } コンストラクタ 画像データの 登録 Timer クラスのコンス トラクタの呼び出しと 時間の設定 Timer クラスに関す る初期設定(オブジェ クトのメソッドにより設 定) Timer のオブジェクト timer はインスタンス変数として設 定しているのでクラス内の全 メソッドで利用可 timer が動いていなけ れば ‘動かす’と言う処理
上プログラムの63行目に記述
//ウィンドウクローズ、アイコン化のためのウィンドウリスナークラス class WindowOpe extends WindowAdapter {
public void windowClosing(WindowEvent e) { System.exit(0);
}
public void windowIconified(WindowEvent e) { stopAnimation();
}
public void windowDeiconified(WindowEvent e) { startAnimation();
} }
public static void main(String[] args) {
JFrame f = new JFrame("Timer Animation"); TimerAnimation anime = new TimerAnimation( ); f.addWindowListener(anime.new WindowOpe( ));
・・・・・・・・・・・・… }
内部クラスの例 class A{class A{class A{class A{ ……… class B{ class B{ class B{ class B{ ………… } // } // } // } // 内部クラス内部クラス内部クラス内部クラス ……… } } } } TimerAnimation クラスの内 部クラスとして定義されるイベ ントリスナー JFrame のオブジェク トにリスナーを設定
クラス
B のオブジェクト b を作成するには
A a = new A( ); 内部クラスのオブジェクトを設定するため,‘外 の’クラスのオブジェクト anime から直接に内 部クラスのコンストラクタを呼んで作成している ウインドウのアイコン化時のアニメーションの停止と再開 アニメーション実行時中にウィンドウをアイコン化した場合 →アニメーションを停止する
→ウィンドウリスナーを設定
ウィンドウリスナーを設定
ウィンドウリスナーを設定
ウィンドウリスナーを設定
(イベント処理の必要性) (上記のプログラムで,)TimerAnimation クラスの内部クラスとして, WindowAdapter クラスのサブクラスを定義 → アイコン化するため(Window に対するイベントのため
)JFrame に対してウィンドウリスナーを設定 48:49: public void actionPerformed(ActionEvent e) { //アクションイベント処理 50: number++; //次に表示するイメージの通し番号
51: repaint(); //描画 52: }
53:
54: public void paintComponent(Graphics g) { 55: super.paintComponent(g); //背景の描画
56: int x = getWidth( )/2-30; //ウィンドウのほぼ中央にイメージを表示 57: int y = getHeight( )/2-30;
58: try {
59: g.drawImage(image[number%cell], x, y, this); 60: } catch (ArrayIndexOutOfBoundsException e) { return; }
61: //number が-1 の時に描画が呼ばれた時の例外処理 62: }
63:
64: public static void main(String[] args) {
65: JFrame f = new JFrame("Timer Animation"); 66: TimerAnimation anime = new TimerAnimation();
67: f.getContentPane().add(anime, BorderLayout.CENTER); 68: f.setSize(new Dimension(100, 100)); 69: f.setVisible(true); 70: } 71:} イベント処理部 一定時間経過ごとに number を増やし,repaint()する Repaint 毎に PaintComponent が呼び出される number は0 から無 限 に増え続けるので cell で割ったあまりを利用
教科書P153-154 リスト12.1 こんにちはプログラム ※ クラス Hello は ソースとリスナーな混在したプログラムとなっている. 初期画面 「ごあいさつ」をクリック 「消去」をクリック // リスト 12.1 こんに ちはプ ログラ ム(Hello.java) 1:import java.awt.*; 2:import java.awt.event.*; 3:import javax.swing.*;
4:class Hello extends JPanel implements ActionListener{ 5: JLabel label; //ラベル用の変数
6: JButton b1, b2;//ボタン用の変数 7: Hello( ){
8: label = new JLabel(" "); //最初は何 も表示 しない 9: b1 = new JButton("ごあいさつ"); //ごあいさ つボタ ン 10: b2 = new JButton("消去"); //消去ボタ ン 11: b1.addActionListener(this); //イベント リスナ ーを設 定 12: b2.addActionListener(this); //イベント リスナ ーを設 定 13: setLayout(new BorderLayout()); //配置方式 の設定 14: add(label, BorderLayout.NORTH); //ラベルを 置く 15: add(b1, BorderLayout.CENTER); //ボタンを 置く 16: add(b2, BorderLayout.EAST); //ボタンを 置く 17: }
18: public void actionPerformed(ActionEvent e){
19: if(e.getSource() == b1){ //b1 が押さ れたら 20: label.setText("こんにちは"); //label に文字 列を設 定 21: } 22: else if(e.getSource() == b2){ //b2 が押さ れたら 23: label.setText(" "); //label の文字 列を消 す 24: } 25: } 26:
27: public static void main(String args[]){
28: Hello h = new Hello(); //Hello のオブ ジェク トを生 成 29: JFrame frame = new JFrame("Hello"); //JFrame オブジ ェクト を生成 30: Container c = frame.getContentPane(); //フレーム の内容 表示域 を得る 31: c.add(h, BorderLayout.CENTER); //フレームに Hello オブジェクトを置く 32: frame.pack(); //フレームを必要最小の大きさにする 33: frame.setVisible(true); //フレーム を画面 に見せ る 34: } 35:}