UML によるソフトウェア設計 Java プログラミング 2 1
アジェンダ 1 グラフィカルなインタフェース GUI(Graphical User Interface) の基礎 2 Swing を利用する Swing の基礎知識 2
1. グラフィカルなインタフェース ウィンドウの作成手順 1. ウィンドウ ( フレーム ) を作成する JFrame frame = new JFrame(); 2. ウィジェット ( ボタンなど ) を作成する JButton button = new Button( click me ); 3. ウィジェットをウィンドウに組み込む frame.getcontentpane().add(button); ウィジェットはウィンドウに直に組み込まず コンテンツペイン と呼ばれるオブジェクトに組み込む ウィンドウは 窓枠 ペインは ガラス のようなもの 4. 作成したウィンドウのサイズを指定し表示する frame.setsize(300, 300); frame.setvisible(true); Copyright(c) 2007 University of Tsukuba and Sun Microsystems, Inc. All rights reserved. 3
1.1. 実際のソースコード import javax.swing.*; swing パッケージをインポート public class SimpleGui1 { public static void main(string[] args) { JFrame frame = new JFrame(); JButton button = new JButton( click me ); } } frame.setdefaultcloseoperation(jframe.exit_on_close); このように書くと ウィンドウを閉じると同時にプログラムが終了 frame.getcontentpane().add(button); frame.setsize(300, 300); frame.setvisible(true); ボタンが大きい Copyright(c) 2007 University of Tsukuba and Sun Microsystems, Inc. All rights reserved. 4
1.2. イベント処理 SimpleGui1 クラスは ボタンをクリックしても何も起きない 何か処理を行わせるには以下の 2 つが必要 1. ユーザがボタンをクリックした時に自動的に呼び出されるメソッド 2. ユーザがボタンをクリックしたこと ( イベント ) を検知し メソッドを呼び出す手段 1. ユーザがクリックしたら伝えて欲しい と指示 プログラム ボタンオブジェクト 2. イベントの発生が知らされる Copyright(c) 2007 University of Tsukuba and Sun Microsystems, Inc. All rights reserved. 5
1.3. リスナインタフェース 前のページの プログラム とは リスナインタフェース と呼ばれるインタフェースを実装したもの イベントリスナ ( 上記実装 ) を作れば イベントソース ( ボタンなど ) からイベント ( オブジェクト ) を受け取ることができる << インタフェース >> ActionListener actionperformed(actionevent ev) << インタフェース >> ItemListener itemstatechanged(itemevent ev) << インタフェース >> KeyListener keypressed(keyevent ev) keyreleased(keyevent ev) keytyped(keyevent ev) Copyright(c) 2007 University of Tsukuba and Sun Microsystems, Inc. All rights reserved. 6
1.4. リスナとソースのコミュニケーション リスナのリストに追加してください クリックされたら actionperformed() メソッドを呼んでください button.addactionlistener(this) actionperformed(the Event) イベントソース イベントリスナ わかりました リスナのリストに追加します クリックされたら actionperformed() メソッドを呼び出します Copyright(c) 2007 University of Tsukuba and Sun Microsystems, Inc. All rights reserved. 7
1.5. ActionEvent の扱い テキスト 360 ページのソースコード参照 1.ActionListener インタフェースを実装する 2. リスナをボタンに登録する ( これで イベントを受け取りたい という意志がイベントソースに伝わる ) 3. イベント処理のためのメソッド (ActionListener インタフェースを使う場合は actionperformed() メソッド ) を実装する Copyright(c) 2007 University of Tsukuba and Sun Microsystems, Inc. All rights reserved. 8
1.6. リスナ ソース イベント ソースはイベントオブジェクトを送る リスナはイベントオブジェクトを受け取る イベントオブジェクトはイベントに関する情報を保持するイベントオブジェクト Copyright(c) 2007 University of Tsukuba and Sun Microsystems, Inc. All rights reserved. 9
1.7. 描画パネル 描画パネル とは プログラマが自ら図形を描いたりすることができるウィジェット JPanel クラスを継承して paintcomponent() メソッドをオーバライドする import java.awt.*; import javax.swing.*; 両方必要 public class MyDrawPanel extends JPanel { public void paintcomponent(graphics g) { Graphics2D g2d = (Graphics2D)g; Graphics2D クラスは Graphics クラスのサブクラス } g2d.setcolor(color.orange); g2d.fillrect(20, 50, 100, 100); } g2d は描画を行う機械のようなもの Copyright(c) 2007 University of Tsukuba and Sun Microsystems, Inc. All rights reserved. 10
1.8. イベントと図形の描画 1. 描画パネルとボタンの 2 つのウィジェットを備えたフレームが画面に表示される ボタンには イベントリスナが登録され クリックに対応できる状態になる 2. ボタンをクリックすると イベントオブジェクトが自動で作成され イベントリスナのメソッド ( イベントハンドラ ) が呼び出される 3. イベントハンドラがフレームオブジェクトの repaint() メソッドを呼び出す すると システムによって描画パネルオブジェクトの paintcomponent() メソッドが呼び出される 4. paintcomponent() メソッドによって円の色が変更される ( 色は無造作に選ばれる ) Copyright(c) 2007 University of Tsukuba and Sun Microsystems, Inc. All rights reserved. 11
1.9. 実際のソースコード テキスト 371 ページ参照 参考 : フレームのレイアウト north frame.getcontentpane().add(drawpanel); west center east このように書くとデフォルトで center に描画パネルが配置されるが south 通常は このように配置する領域を指定する frame.getcontentpane().add(borderlayout.center, drawpanel); Copyright(c) 2007 University of Tsukuba and Sun Microsystems, Inc. All rights reserved. 12
1.10. ボタンを 2 つにする 扱うイベントが 2 つになる ラベルを変更するボタン ラベル 円の色を変化させるボタン Copyright(c) 2007 University of Tsukuba and Sun Microsystems, Inc. All rights reserved. 13
1.11. 複数のイベント扱う方法 1.actionPerformed() メソッドを 2 つ作るこのようなコードは実際に書けない 2.2 つのボタンに同じリスナを登録する正しく動作するが オブジェクト指向的 ではない 3. イベントリスナを 2 つ作る ( 別クラスとして ) リスナオブジェクトは frame や label といった変数にアクセスできない 3. はいいアイディアだが インスタンス変数にアクセスするのが大変 何かよい方法は Copyright(c) 2007 University of Tsukuba and Sun Microsystems, Inc. All rights reserved. 14
1.12. 内部クラス 内部クラス とはクラスの中に作られたクラス class MyOuterClass { } class MyInnerClass {... } 内部クラスで外部クラスの変数を利用する class MyOuterClass { private int x; } class MyInnerClass { void go() { x = 42; 変数 x は内部クラス } の変数と同じように } 使用できる 内部クラスでは 外部クラスの変数やメソッドを利用する際 たとえ private 宣言されていても自らのものと同様に利用できる Copyright(c) 2007 University of Tsukuba and Sun Microsystems, Inc. All rights reserved. 15
1.13. 内部クラスと外部クラスの関係 1. 外部クラスのオブジェクトを作成する 2. 既に作成した外部オブジェクトを使って内部オブジェクトを作成する 3. これにより 外部オブジェクトと内部オブジェクトは緊密に結びつく MyOuter オブジェクト MyInner オブジェクト MyOuter オブジェクト int x String s MyInner オブジェクト Copyright(c) 2007 University of Tsukuba and Sun Microsystems, Inc. All rights reserved. 16
1.14. 修正されたプログラム テキスト 379 ページ参照 2 つのリスナクラス TwoButtons 外部クラス 内部クラス 内部クラス 円の色を変化させるためのリスナクラス (ColorListener) ラベルを変更するためのリスナクラス (LabelListener) Copyright(c) 2007 University of Tsukuba and Sun Microsystems, Inc. All rights reserved. 17
Swing の基礎知識 2. Swing を利用する Swing コンポーネント コンポーネント とは ウィジェット とほぼ同義語 コンポーネントの多くが javax.swing.jcomponent を継承するオブジェクト JButton JCehckBox JTextField インタラクティブなコンポーネント 他のコンポーネントの 容れ物 となるコンポーネント ( バックグラウンドコンポーネント ) JFrame JPanel Copyright(c) 2007 University of Tsukuba and Sun Microsystems, Inc. All rights reserved. 18
Swing の基礎知識 2.1. レイアウトマネージャ レイアウトマネージャ は あるコンポーネントに他のコンポーネントが組み込まれる際 そのサイズや配置などを決定するオブジェクト パネル B のレイアウトマネージャは 3 つのボタンのサイズと配置を決める ボタン 1 ボタン 2 ボタン 3 パネル B パネル A のレイアウトマネージャはパネル B のサイズと配置を決める (3 つのボタンには一切関知しない ) パネル A Copyright(c) 2007 University of Tsukuba and Sun Microsystems, Inc. All rights reserved. 19
Swing の基礎知識 2.2. レイアウトの手順 1. パネルが作成され ボタンが組み込まれる 2. パネルのレイアウトマネージャが サイズに関するボタン側の要望を確認する 3. パネルのレイアウトマネージャが 自らのレイアウトルールに基づき ボタン側の要望をどの程度受け入れるかを決定する 4. パネルがフレームに組み込まれる 5. フレームのレイアウトマネージャが サイズに関するパネル側の要望を確認する 6. フレームのレイアウトマネージャが 自らのレイアウトルールに基づき パネル側の要望をどの程度受け入れるかを決定する Copyright(c) 2007 University of Tsukuba and Sun Microsystems, Inc. All rights reserved. 20
Swing の基礎知識 2.3. レイアウトマネージャの種類 BorderLayout バックグラウンドコンポーネントを 5 つの領域に分割するレイアウトマネージャ 各領域に組み込めるコンポーネントは 1 つ フレームのデフォルトレイアウトマネージャ FlowLayout コンポーネントは組み込まれた順に左から右に並べられる 右端に到達すると自動的に改行される パネルのデフォルトレイアウトマネージャ BoxLayout FlowLayout と似ているが コンポーネントを縦あるいは横に並べることができる ( 意図的に改行が できる ) 上記以外にもいくつかレイアウトマネージャがある Copyright(c) 2007 University of Tsukuba and Sun Microsystems, Inc. All rights reserved. 21
Swing の基礎知識 2.4. さまざまな Swing コンポーネント JTextField JTextArea JCheckBox JList Copyright(c) 2007 University of Tsukuba and Sun Microsystems, Inc. All rights reserved. 22
Swing の基礎知識 2.5. JTextField コンストラクタ JTextField field = new JTextField(20); // 20 文字分の長さ指定 JTextField field = new JTextField( Your name ); API の例 1field.getText(); // テキストの抽出 2field.setText( text ); // テキストの入力 3field.addActionListener(myActionListener); // Enter キーを押したイベントを処理するリスナの登録 4field.selectAll(); // テキストを選択 ( ハイライト表示 ) 5field.requestFocus(); // フォーカスをあてる Copyright(c) 2007 University of Tsukuba and Sun Microsystems, Inc. All rights reserved. 23
Swing の基礎知識 2.6. JTextArea コンストラクタ JTextArea text = new JTextArea(10, 20); // 10 行 20 文字分の領域を指定 API の例 1JScrollPane scroller = new JScrollPane(text); 2scroller.setVerticalScrollBarPolicy( 2 ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); 2scroller.setHorizontalScrollBarPolicy( 2 ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS); 2panel.add(scroller); // 縦のスクロールバーのみを持つテキストエリアを作成 2text.setText( text ); // テキストの変更 3text.append( text2 ); // テキストの追加 4text.selectAll(); // テキストを選択 ( ハイライト表示 ) 5text.requestFocus(); // フォーカスをあてる Copyright(c) 2007 University of Tsukuba and Sun Microsystems, Inc. All rights reserved. 24
Swing の基礎知識 2.7. JCheckBox コンストラクタ JCheckBox check = new JCheckBox( CheckBox ); API の例 1check.addItemListener(this); // チェックが ON/OFF されたイベントを処理するリスナの登録 2public void itemstatechanged(itemevent ev) { 2 String onoroff = off ; 2 if (check.isselected()) onoroff = on ; 2 System.out.println( CheckBox is + onoroff); 2} // イベントを処理する 3check.setSelected(true); // チェックを ON にする 2check.setSelected(false); // チェックを OFF にする Copyright(c) 2007 University of Tsukuba and Sun Microsystems, Inc. All rights reserved. 25
Swing の基礎知識 2.8. JList コンストラクタ String[] listentries = { alpha, beta, gamma, delta }; JList list = new JList(listEntries); API の例 1JScrollPane scroller = new JScrollPane(list); 2scroller.setVerticalScrollBarPolicy( 2 ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); 2scroller.setHorizontalScrollBarPolicy( 2 ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS); 2panel.add(scroller); // 縦のスクロールバーのみを持つリストを作成 2list.setVisibleRowCount(3); // 表示行の指定 3list.addListSelectionListener(this); // リストが選択されたイベントを処理するリスナの登録 4public void valuechanged(listselectionevent lev) { 4 if (!lev.getvalueisajusting()) { 4 String selection = (String)list.getSelectedValue(); 4 System.out.println(selection); 4} // イベントの処理 ( 選択されている項目を表示 ) Copyright(c) 2007 University of Tsukuba and Sun Microsystems, Inc. All rights reserved. 26