プログラミング言語 3 第 11 回 (2007 年 12 月 10 日 ) 1
今日の配布物 片面の用紙 1 枚 今日の課題が書かれています 本日の出欠を兼ねています 2/57
今日やること http://www.tnlab.ice.uec.ac.jp/~s-okubo/class/java06/ にアクセスすると 教材があります 2007 年 12 月 10 日分と書いてある部分が 本日の教材です 本日の内容 前回の課題の解答 Java アプレットその 2 AWT 3/57
最終レポートについて 4/57
課題について 最終レポートの課題を 今週の木曜日夜までに web にアップします 〆切は最後の授業 (2008 年 1 月 7 日 ) です 最後の授業では レポートと関係ない話をやります ( たぶん 入出力関係とスレッド ) レポートは 紙に印刷したものをレポートボックスに メールで s-okubo@ice.uec.ac.jp に 提出して貰います 5/57
前回の課題の解答 6/57
前回の課題 その 1: 次の仕様を満たす Java アプレット Sample10t.java を作り 提出しなさい html ファイルが無くともアプレットビューアで実行できること 実行すると 200x400 の画面が立ち上がる 200x400 の画面の 上半分の左半分をクリックすると 下半分に白い背景に黒く Hello World と表示される 上半分の右半分をクリックすると 下半分に黒い背景に黄色い円と白い四角が表示される 7/57
プログラムの設計方針 flag という整数型の変数を宣言 クリックしたときに実行される mousepressed では... クリックされた場所によって 0 か 1 の どちらかの値を flag に保存する その後 repaint を実行する 結果 paint も実行される paint では... flag の値に従って 下に描画を行う 同じ事ができれば 他の方法でも構いません 8/57
サンプルプログラム [1/4] import java.applet.applet; import java.awt awt.*;.*; import java.awt awt.event.*; /* /* */ */ 必要なパッケージを import 200x400 のサイズ <applet code="javaapplet10t.class" width=200 height=400> </applet> public class JavaApplet10t extends Applet implements MouseListener{ int intx=10,y=10; int int flag=0; flagを宣言マウスを使うので public void void init(){ MounseListenerを実装 addmouselistener(this); マウス関係のイベントを検知するように 9/57
サンプルプログラム [2/4] public void void paint(graphics g){ g){ if(flag==0){ g.setcolor setcolor(color.white); g.fillrect fillrect(0,200,200,400); g.setcolor setcolor(color.black); g.drawstring drawstring("hello World",30,240); else if(flag==1){ g.setcolor setcolor(color.black); g.fillrect fillrect(0,200,200,400); g.setcolor setcolor(color.yellow); g.drawarc drawarc(20,220,160,160,0,360); g.setcolor setcolor(color.white); g.drawrect drawrect(20,220,160,160); 下半分を白く塗り Hellow World を表示 下半分を黒く塗り 四角と円を表示 flag の値に従って 描画を行う 10/57
サンプルプログラム [3/4] public void voidmousepressed(mouseevent me){ me){ x=me.getx getx(); (); y=me.gety gety(); (); if((y>=0)&&(y<=200)){ if((x>=0)&&(x<100)){ flag=0; else if((x>=100)&&(x<200)){ flag=1; repaint(); クリックした場所が下半分か否かを判定 クリックした場所が右側か左側かを判定 クリック時のマウスの座標を保存クリックした 場所に応じた値に flag を設定 クリックした場所に応じた値に flag を設定 11/57
サンプルプログラム [4/4] public void voidmouseentered(mouseevent me){ me){ 残りの4つのメソッドをオーバーライド public void voidmouseexited(mouseevent me){ me){ public void voidmousereleased(mouseevent me){ me){ public void voidmouseclicked(mouseevent me){ me){ 12/57
AWT 13/57
Java とアプレット Java には GUI を作るのに便利なクラスファイルやインターフェイスが準備されています GUI に使用されるボタンやダイアログは すべてインスタンス ( オブジェクト ) として扱われます AWT と Swing があります AWT は Java に古くからあるものです あまり効率よく動いてはくれません Swing は AWT の欠点とかを改善するべく作られたものです 今回は AWT を 次回は Swing をやります 14/57
基本的な流れ 次のような手順を踏みます 1. 適切なインターフェースを実装する 2. 適切なインスタンスを宣言する 3. インスタンスを登録する 4. インスタンスに何らかのアクションが行われたときに ある動作を行いたいなら 1. Javaがそのアクションを関知するようにする ( リスナ登録する ) 2. そのアクションが行われたときに 何をするかを記述する 15/57
用意されているもの 次のようなものが利用できます ラベル ボタン テキストフィールド チェックボックス チェックボックスグループ ( ラジオボタン ) キャンバス リスト チョイス 16/57
ラベルその 1 ラベルとは... 文字列を画面に表示します インターフェース なし リスナ登録 なし クラス Label 17/57
ラベルその 2 インスタンス生成時に 文字列を指定します Label インスタンス名 = new Label(" 文字列 "); この文字列の長さが このインスタンスが持てる文字列の最大の長さになります クラス Label のメソッド settext(string ss) gettext() そのインスタンスに文字列 ss を設定します そのインスタンスの持っている文字列を返します 18/57
サンプルプログラム import java.applet.applet; import java.awt.*; import java.awt.event.*; /* /* <applet code="sample11a.class" width=200 height=400> </applet> */ */ public class Sample11a extends Applet{ インスタンスを生成 Label lb1 lb1 = new new Label("Sample11a"); String ss; ss; public void void init(){ インスタンスを登録 add(lb1); lb1.settext settext("test"); ss ss = lb1.gettext gettext(); メソッドは 普通に (); add(lb1); インスタンス名. メソッド名 で使用 19/57
ボタンその 1 ボタンとは... 押すことができるボタンを作ります インターフェース ActionListener クラス Button リスナ登録 addactionlistener( インスタンス名 ); 押されたときに呼び出されるメソッド actionperformed(actionevent e) 20/57
ボタンその 2 インスタンス生成時に 文字列を指定します Button インスタンス名 = new Button(" 表示する文字列 "); ボタンが押されたことを Java が検知するに次が必要 インスタンス名.addActionListener(this); ボタンが押されると actionperformed が実行されます 複数のボタンのインスタンスがあっても actionperformed は 1 つだけです どのボタンが押されたかは ActionEvent のオブジェクトのメソッド getsource() で知ることができます 21/57
サンプルプログラム [1/2] import java.applet.applet; import java.awt.*; import java.awt.event.*; /* /* <applet code="sample11b.class" width=200 height=400></applet> */ */ インターフェイス ActionListener を実装 public class Sample11b extends Applet implements ActionListener{ Button bt1 bt1 = new new Button("Button 1"); 1"); Button bt2 bt2 = new new Button("Button 2"); 2"); Label lb1 lb1 = new new Label("Sample11b"); インスタンスを生成 public void void init(){ bt1.addactionlistener addactionlistener(this); ボタンが押されたことを bt2.addactionlistener addactionlistener(this); 検知するようにする add(bt1); add(bt2); add(lb1); インスタンスを登録 22/57
サンプルプログラム [2/2] public void void actionperformed(actionevent e){ e){ if(e.getsource getsource() () == == bt1){ lb1.settext("bottun 01"); else if(e.getsource getsource() () == == bt2){ lb1.settext("bottun 02"); どのボタンが押されたかで条件分岐 ボタンが押されたときに行うことを書く 23/57
テキストフィールドその 1 テキストフィールドとは... テキストを入力できる場所です インターフェース ActionListener クラス TextField リスナ登録 addactionlistener( インスタンス名 ); リターンが押されたときに呼び出されるメソッド actionperformed(actionevent e) 24/57
テキストフィールドその 2 インスタンス生成時は次のようにします TextField インスタンス名 = new TextField(" 文字列 "); この場合 文字列の長さ文のサイズで表示されます また 文字列が最初に入った状態になります TextField インスタンス名 = new TextField( 値 ); ); この場合 値のサイズで表示されます TextField インスタンス名 = new TextField(" 文字列 ", ", 値 ); ); この場合 値のサイズで表示されます また 文字列が最初に入った状態になります 25/57
テキストフィールドその 3 ボタンが押されたことを Java が検知するに次が必要 インスタンス名.addActionListener(this); テキストフィールド内でリターンキーが押されると actionperformed が実行されます 複数のインスタンスがあっても actionperformed は 1 つだけです どのテキストフィールド内でリターンキーが押されたかは ActionEvent のオブジェクトのメソッド getsource() で知ることができます 26/57
テキストフィールドその 4 クラス TextField のメソッド settext(string ss) gettext() そのインスタンスに文字列 ss を設定します そのインスタンスの持っている文字列を返します 27/57
サンプルプログラム [1/2] import java.applet.applet; import java.awt.*; import java.awt.event.*; /* /* <applet code="sample11c.class" width=200 height=200></applet> */ */ インターフェイス ActionListener を実装 public class Sample11c extends Applet implements ActionListener{ TextField tf1 tf1 = new new TextField(" ("TextField TextField",20); Label lb1 lb1 = new new Label("Sample11c"); public void void init(){ インスタンスを生成 tf1.addactionlistener addactionlistener(this); add(tf1); テキストフィールド内で add(lb1); リターンが押された ことを検知するように インスタンスを登録 28/57
サンプルプログラム [2/2] public void void actionperformed(actionevent e){ e){ if(e.getsource getsource() () == == tf1){ lb1.settext(tf1. tf1.gettext gettext() ()); ()); tf1.settext settext("input here"); どのテキストフィールドでリターンが押されたかで条件分岐 テキストフィールド内でリターンが押されたときに行うことを書く 29/57
チェックボックスその 1 チェックボックスとは... 四角いボックスにチェックを入れるやつです インターフェース ItemListener クラス Checkbox リスナ登録 additemlistener( インスタンス名 ); リターンが押されたときに呼び出されるメソッド itemstatechanged(itemevent e) 30/57
チェックボックスその 2 インスタンス生成時は次のようにします Checkbox インスタンス名 = new Checkbox(" 文字列 "); チェックボックスが沢山必要なときは その数だけ インスタンスを生成することになります 31/57
チェックボックスその 3 チェックボックスの状態が変わったことを Java が検知するには 次のリスナ登録が必要です インスタンス名.addItemListener(this); チェックボックスがクリックされると itemstatechanged が実行されます 複数のインスタンスがあっても itemstatechanged は1つだけです どのボタンが押されたかは ItemEvent のオブジェクトのメソッド getsource() で知ることができます 32/57
チェックボックスその 4 クラス Checkbox のメソッド setstate(boolean) そのインスタンスの持つ状態を設定します 引数として true か false を渡します gettext() そのインスタンスの状態を返します チェックが入っていれば true を 無ければ false を返します 33/57
サンプルプログラム [1/2] import java.applet.applet; import java.awt.*; import java.awt.event.*; /* /* <applet code="sample11d.class" width=200 height=200></applet> */ */ インターフェイス ItemListener を実装 public class Sample11d extends Applet implements ItemListener{ Checkbox cb1 cb1 = new new Checkbox("Check Box Box 01"); Checkbox cb2 cb2 = new new Checkbox("Check Box Box 02"); Label lb1 lb1 = new new Label("Sample11d"); インスタンスを生成 public void void init(){ cb1.additemlistener additemlistener(this); チェックボックスの cb2.additemlistener additemlistener(this); 状態の変更を検知 add(cb1); するように add(cb2); add(lb1); インスタンスを登録 34/57
サンプルプログラム [2/2] public void void itemstatechanged(itemevent e){ e){ lb1.settext(cb1. cb1.getstate getstate() () + "-" "-" + cb2.getstate getstate() ()); ()); チェックボックスの状態が変わったときに行うことを書く 35/57
チェックボックスグループその 1 チェックボックスグループとは... どれか 1 つにのみチェックできるチェックボックスです インターフェース ItemListener クラス CheckboxGroup リスナ登録 additemlistener( インスタンス名 ); リターンが押されたときに呼び出されるメソッド itemstatechanged(itemevent e) 36/57
チェックボックスグループその 2 インスタンス生成時は次のようにします CheckboxGroup インスタンス名 = new CheckboxGroup(); チェックボックスグループは 複数のチェックボックスをグループに登録することにより作成します チェックボックスのインスタンス生成時に どのチェックボックスグループに属するのかを宣言します Checkbox インスタンス名 = new Checkbox(" 文字列 ", ", 初期状態, グループ名 ); ); 初期状態には true か false を指定します true な状態はグループ内に 1 つだけ許されます 37/57
チェックボックスグループその 3 チェックボックスグループはリスナ登録しません 代わりに チェックボックスをリスナ登録しておきます チェックボックスがクリックされると itemstatechanged が実行されます 複数のインスタンスがあっても itemstatechanged は 1 つだけです 38/57
サンプルプログラム [1/2] import java.applet.applet; import java.awt.*; import java.awt.event.*; /* /* <applet code="sample11e.class" width=200 height=200></applet> */ */ インターフェイス ItemListener を実装 public class Sample11e extends Applet implements ItemListener{ CheckboxGroup cbg1 cbg1 = new new CheckboxGroup(); Checkbox cb1 cb1 = new new Checkbox("Check Box Box 01",true,cbg1); Checkbox cb2 cb2 = new new Checkbox("Check Box Box 02",false,cbg1); Label lb1 lb1 = new new Label("Sample11d"); インスタンスを生成 public void void init(){ cb1.additemlistener additemlistener(this); cb2.additemlistener additemlistener(this); チェックボックスの add(cb1); 状態の変更を検知 add(cb2); するように add(lb1); インスタンスを登録 39/57
サンプルプログラム [2/2] public void void itemstatechanged(itemevent e){ e){ if(cb1.getstate() == == true){ lb1.settext("test 01"); else if(cb2.getstate() == == true){ lb1.settext("test 02"); チェックボックスの状態が変化したときに行うことを書く 40/57
リストその 1 リストとは... 一覧からどれか一つを選択するものです インターフェース ActionListener クラス List リスナ登録 addactionlistener( インスタンス名 ); ある項目がダブルクリックときに呼び出されるメソッド actionperformed(actionevent e) 41/57
リストその 2 インスタンス生成時は次のようにします List インスタンス名 = new List( 値 ); ); 引数として 一度に表示する項目数を指定します リスト内に表示する項目は List クラスのメソッド add を使って追加していきます 一度に表示できる項目数よりも add で追加された項目数の方が多い場合は スクロールバーが出ます 42/57
リストその 3 ダブルクリックされたことを Java が検知するのには次のリスナ登録が必要です インスタンス名.addActionListener(this); 項目がダブルクリックされると actionperformed が実行されます 複数のインスタンスがあっても actionperformed は 1 つだけです どのリストがダブルクリックされたかは ActionEvent のオブジェクトのメソッド getsource() で知ることができます 43/57
リストその 4 クラス Checkbox のメソッド add(" 文字列 ") リストに文字列を項目として追加します getselecteditem() 選択された項目を返します 44/57
サンプルプログラム [1/2] import java.applet.applet; import java.awt.*; import java.awt.event.*; /* /* <applet code="sample11f.class" width=200 height=200></applet> */ */ インターフェイス ActionListener を実装 public class Sample11f extends Applet implements ActionListener{ List List ls1 ls1 = new new List(3); Label lb1 lb1 = new new Label("Sample11d"); public void void init(){ インスタンスを生成 ls1.addactionlistener addactionlistener(this); ls1.add("test 001"); チェックボックスの項目を追加 ls1.add("test 002"); 状態の変更を検知 ls1.add("test 003"); するように ls1.add("test 004"); ls1.add("test 005"); ls1.add("test 006"); 45/57
サンプルプログラム [2/2] add(ls1); インスタンスを登録 add(lb1); public void void actionperformed(actionevent e){ e){ lb1.settext(ls1. ls1.getselecteditem getselecteditem() ()); ()); チェックボックスの状態が変化したときに行うことを書く 46/57
チョイスその 1 リストとは... 一覧からどれか一つを選択するものです インターフェース ItemListener クラス List リスナ登録 additermlistener( インスタンス名 ); ある項目が選択ときに呼び出されるメソッド itemstatechanged(itemevent e) 47/57
チョイスその 2 インスタンス生成時は次のようにします Choice インスタンス名 = new Choice(); リスト内に表示する項目は List クラスのメソッド add を使って追加していきます 一度に表示できる項目数は 1 つです プルダウンメニューにより 項目を選択します 48/57
チョイスその 3 項目が選択されたことを Java が検知するためには 次のリスナ登録が必要です インスタンス名.addItemListener(this); 選択された項目が変わったことが検知されると itemstatechanged が実行されます 複数のインスタンスがあっても itemstatechanged は 1 つだけです どのチョイスの状態が変更されたかが押されたかは ItemEvent のオブジェクトのメソッド getsource() で知ることができます 49/57
チョイスその 4 クラス Checkbox のメソッド add(" 文字列 ") リストに文字列を項目として追加します getselecteditem() 選択された項目を返します 50/57
サンプルプログラム [1/2] import java.applet.applet; import java.awt.*; import java.awt.event.*; /* /* <applet code="sample11g.class" width=200 height=200></applet> */ */ インターフェイス ItemListener を実装 public class Sample11g extends Applet implements ItemListener{ Choice ch1 ch1 = new new Choice(); Label lb1 lb1 = new new Label("Sample11d"); インスタンスを生成 public void void init(){ ch1.additemlistener additemlistener(this); ch1.add("test 001"); 項目を追加 ch1.add("test 002"); ch1.add("test 003"); add(ch1); add(lb1); インスタンスを登録 チェックボックスの状態の変更を検知するように 51/57
サンプルプログラム [2/2] public void void itemstatechanged(itemevent e){ e){ lb1.settext(ch1. ch1.getselecteditem getselecteditem() ()); ()); 選択されている項目が変化したときに行うことを書く 52/57
キャンバスその 1 キャンバスとは... 描画することができるフィールドです インターフェース なし リスナ登録 なし クラス Canvas 53/57
キャンバスその 2 実際にキャンバスを利用するときは 1. クラス Canvas をスーパークラスにもつサブクラスを作り 2. そのインスタンスを生成します します 描画は サブクラスを作るときに paint() メソッドをオーバーライドすることで行います 54/57
ラベルその 2 クラス Cancas のメソッド paint(graphics g) 普通 サブクラスでオーバーライドします setsize(int width, int height) キャンバスのサイズを設定します width の幅と hieght の高さになります 55/57
サンプルプログラム [1/2] import java.applet.applet; import java.awt.*; import java.awt.event.*; /* /* <applet code="sample11h.class" width=200 height=200> </applet> */ */ Canvasをスーパークラス class TestCanvas extends Canvas{ に持つサブクラスを作る public void void paint(graphics g){ g){ g.drawarc(20,20,160,160,0,360); g.drawrect(20,20,160,160); paintを書く 56/57
サンプルプログラム [1/2] public class Sample11h extends Applet{ TestCanvas cv1 cv1 = new new TestCanvas(); (); public void void init(){ cv1.setsize setsize(100,100); add(cv1); インスタンスを登録 インスタンスを生成 インスタンスの表示サイズを設定 57/57