Java/Swingについて (3) 2005年10月19日 海谷 治彦.

Slides:



Advertisements
Similar presentations
Ver 準備 Java フォルダに移動して …… mkdir Swing Swing フォルダに移動して …… cp ~gundam/Java/Swing. コマンドプロンプト ( JDK ) でないと起動 しないので注意!!!
Advertisements

ソフトウェア工学 知能情報学部 新田直也. オブジェクト指向パラダイムと は  オブジェクト指向言語の発展に伴って形成され てきたソフトウェア開発上の概念.オブジェク ト指向分析,オブジェクト指向設計など,プロ グラミング以外の工程でも用いられる.  ソフトウェアを処理や関数ではなくオブジェク.
6.4継承とメソッド 6.5継承とコンストラクタ 11月28日 時田 陽一
社会人学習講座 「Javaプログラミング概論」
         第9回 Swing.
Applet 岡部 祐典 鈴木 敬幸.
~手続き指向からオブジェクト指向へ(Ⅰ)~
JAVA GUIプログラミング 第6回 TextFieldとLabel.
アルゴリズムとデータ構造1 2007年6月12日
Iアプリプログラミング その1  鳥居秀徳.
アルゴリズムとプログラミング (Algorithms and Programming)
Javaのインタフェース についての補足 2006年5月17日 海谷 治彦.
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
 Applet アプレット ◇長い長いアプレット講座◇.
第14回 GUIの構成とイベント・ドリブン ~GUIを使ったプログラム(Ⅰ)~.
プログラミング実習 1・2 クラス 第 1 週目 担当教員:  渡邊 直樹.
JAVA GUIプログラミング 第5回 ボタンとそのイベント処理.
プログラミングIII演習 第1回目.
社会人学習講座 「Javaプログラミング概論」
第2章 Eclipseと簡単なオブジェクト 指向プログラミング
インタフェース プログラミング 第14回 インタフェース プログラミング第14回.
アプレット プログラミング 第10回 アプレット プログラミング第10回.
第11回 GUI(グラフィカル・ユーザ・インターフェース)の設計
プログラミング演習3 第2回 GUIの復習.
実行時のメモリ構造(2) Javaスタック内動作他
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
ソフトウェア工学 知能情報学部 新田直也.
アルゴリズムとデータ構造演習(6月24日) グラフィックス、その2 テキストフィールドで入力する チェックボックスで1つ以上指定する
アルゴリズムとプログラミング (Algorithms and Programming)
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
Java/Swingについて (2) 2005年10月11日 海谷 治彦.
JAVA入門後期⑦ JAVAのSwingの基本構造
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
リファレンスの復習と例外処理 2005年6月14日 海谷 治彦.
プログラミング演習3 第3回 ミニプロジェクト.
暗黙的に型付けされる構造体の Java言語への導入
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
プログラミング演習3 第2回 GUIの復習.
クラスファイルの構造解析(2) 2003年6月23日 海谷 治彦.
7.4 intanceof 演算子 7.5~7.9パッケージ 2003/11/28 紺野憲一
Java/Swingについて+ (4) 2005年10月26日 海谷 治彦.
オブジェクト指向 プログラミング 第十ニ回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
JAVA入門後期④ イベント、AWT、の基本構造、スレッド
アルゴリズムとプログラミング (Algorithms and Programming)
オブジェクト指向 プログラミング 第九回 知能情報学部 新田直也.
ソフトウェア工学 知能情報学部 新田直也.
JAVA GUIプログラミング 第3回 イベント処理① マウスイベント.
オブジェクト指向言語論 第十二回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
C#プログラミング実習 第3回.
計算機プログラミングI 第3回 プリミティブ値 クラスメソッド クラス変数 式と演算 変数の利用
Javaによる Webアプリケーション入門 第4回
JAVA入門⑥ クラスとインスタンス.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第四回 知能情報学部 新田直也.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
オブジェクト指向言語論 第十回 知能情報学部 新田直也.
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
計算機プログラミングI 第10回 2002年12月19日(木) メソッドの再定義と動的結合 クイズ メソッドの再定義 (オーバーライド)
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
Presentation transcript:

Java/Swingについて (3) 2005年10月19日 海谷 治彦

目次 メニューとAbstractAction ダイアログ ファイルダイヤログ Inner Class (内部クラス) Anonymous Inner Class (無名内部クラス) GUIでもちっとはクラス図を使おう. 実行可能アーカイブ (jar)の作り方 エクリプス無しでも実行したい.

メニューとAbstractAction メニューをつけると「それっぽい」プログラムになります. 従来のListener, Adapterではなく,AbstractActionを使って,メニュー選択時の動作を設定することもできる. 例題参照.

ダイヤログ メインのウインドウとは別のウインドウを出して, 警告 確認 選択肢 簡単な文字列入力 等ができるもの. Swingでは,JOptionPaneクラス内にあるstaticメソッド(クラスメソッド)を利用することで,異常に簡単に実現可能. 個人的にはウザいと思うこともある. 特に確認系のダイヤログとか.

警告 showMessageDialog() 入力エラーやプログラムの状態の不具合等をユーザーに警告するもの. 単にメインウインドウ(の隅の方)に警告が出るよりわかりやすい.

警告の例 ボタンを押したら「押すな」と警告するプログラム(涙)

確認 とりかえしのつかないこと等を実行する場合に,ホントにやっていいかを確認する場合など. showConfirmDialog() の返り値として, 0 はいの場合 1 いいえ 2 とりけし

確認の例 いきなりプログラムを停止するのではなく, とりあえず一度確認するとか.

ファイルについて 詳細は例題を参照.

Inner Class 内部クラス クラス内部で(ローカルな)クラスを定義できる. あるクラスの完全下請けなクラス(イベントリスナー等)はコレで実装したほうがよいかもしれない. あるクラスの中に定義されているので,親クラス内の属性にアクセスが許可されている.

例 (staticの場合) public class Dialog4 { private static JPanel panel; public static void main(String[] args) { JFrame frame=new JFrame(); frame.setSize(200,300); panel=(JPanel)frame.getContentPane(); JButton b=new JButton("Quit"); b.addMouseListener(new D4Adapter()); panel.add(b, BorderLayout.NORTH); frame.setVisible(true); } static class D4Adapter extends MouseAdapter{ public void mousePressed(MouseEvent arg0) { int ans=JOptionPane.showConfirmDialog(panel, "Really?"); if(ans==0) System.exit(1); 例 (staticの場合)

例 public class Dialog5 extends JFrame { private JPanel panel; super("5"); JFrame frame=new JFrame("4"); frame.setSize(200,300); panel=(JPanel)frame.getContentPane(); frame.setVisible(true); } public void run(){ JButton b=new JButton("Quit"); b.addMouseListener(new D4Adapter()); panel.add(b, BorderLayout.NORTH); panel.validate(); public static void main(String[] args) { new Dialog5().run(); private class D4Adapter extends MouseAdapter{ public void mousePressed(MouseEvent arg0) { int ans=JOptionPane.showConfirmDialog(panel, "Really?"); if(ans==0) System.exit(1); 例

無名インナークラス 以下のような場合,無名インナークラスを用いるのが良い. 1回ポッキリしかインスタンスを作らない. 単にいくつかのメソッドを再定義するだけで済む. インスタンスを参照する場合,実装しているインタフェースもしくはスーパークラスで受ける. 無名インナークラスのもとになるのはクラスでもインタフェースでもよい.

例 (クラス拡張) public class Dialog6 { private static JPanel panel; public static void main(String[] args) { JFrame frame=new JFrame("6"); frame.setSize(200,300); panel=(JPanel)frame.getContentPane(); JButton b=new JButton("Quit"); b.addMouseListener( new MouseAdapter(){ public void mousePressed(MouseEvent e){ int ans=JOptionPane.showConfirmDialog(panel, "Really?"); if(ans==0) System.exit(1); } ); panel.add(b, BorderLayout.NORTH); frame.setVisible(true); 例 (クラス拡張) class XX extends MouseAdapter{ public void mousePressed(MouseEvent e){ int ans=JOptionPane.showConfirmDialog(panel, "Really?"); if(ans==0) System.exit(1); } MouseAdapter a=new XX();

例 (IF実装) public class Dialog7 { private static JPanel panel; public static void main(String[] args) { JFrame frame=new JFrame("7"); frame.setSize(200,300); panel=(JPanel)frame.getContentPane(); JTextField t=new JTextField(20); t.addActionListener( new ActionListener(){ public void actionPerformed(ActionEvent e){ String s=((JTextField)e.getSource()).getText(); int ans=JOptionPane.showConfirmDialog(panel, s); if(ans==0) System.exit(1); } ); panel.add(t, BorderLayout.NORTH); frame.setVisible(true); 例 (IF実装) class XX implements ActionListener{ public void actionPerformed(ActionEvent e){ String s=((JTextField)e.getSource()).getText(); int ans=JOptionPane.showConfirmDialog(panel, s); if(ans==0) System.exit(1); } ActionListener a=new XX();

内部クラスについての考察 推奨するか否かは微妙. 前述の例のように場合によっては手間が減る. インデントが深いので見難い. 変数(属性)の可視スコープをうまく利用したプログラミング(のサボリ)ができる. 逆にスコープを理解してない読みにくくなる. 引数等で明示的にインスタンスへの参照を受け取る方法と相補的. どちらが良いかはケースバイケースだとおもふ.

クラス図からはじめよう GUIを作る場合,クラス図を用いて設計はしにくい. 主な部分は「見てくれ」の部分だし. しかし,特にイベントの流れに相当する部分はクラス図で把握しておくのもよいかもしれない. この実験で紹介したSwingの部品は,基本的にデータの入出力に用いるものである. 計算を行うクラスは従来通りに設計する必要がある.

ボタン系のイベントに対応して行う処理を, 第1回から抜粋 ソースコード public class CounterLabel extends JLabel implements MouseListener { private int c=0; CounterLabel(){ super(0+""); } public void mouseClicked(MouseEvent arg0) {} public void mouseEntered(MouseEvent arg0) {} public void mouseExited(MouseEvent arg0) {} public void mouseReleased(MouseEvent arg0) {} public void mousePressed(MouseEvent arg0) { c++; setText(c+""); } public class Listener1 { public static void main(String[] args){ JFrame jf=new JFrame("Hello"); jf.setSize(300, 100); JPanel panel=new JPanel(); jf.setContentPane(panel); JButton button=new JButton("Up"); panel.add(button); CounterLabel counter=new CounterLabel(); panel.add(counter); button.addMouseListener(counter); jf.setVisible(true); } ボタンbuttonのイベントを ラベルcounterが聞くように指示 ボタン系のイベントに対応して行う処理を, ラベル(リスナー)内に実装.

addMouseListenerはココで定義されてる. 第1回から抜粋 参考までにクラス図 addMouseListenerはココで定義されてる.

第1回から抜粋 相互の関係を網羅すると以下

ソースが複数の場合は? 第1回から抜粋 イベントソース 押すと増える イベントソース 押すと減る リスナー リスナー側で 「どこからの」イベントかを判別しないといけない.

ソース (抜粋) 第1回から抜粋 リスナー ポイントはリスナー側で,複数あるソースの情報を保持していること. public class CounterLabel3 extends JLabel implements MouseListener { private int c=0; private JButton up; private JButton down; CounterLabel3(int x, JButton up, JButton down){ super(x+""); c=x; this.up=up; this.down=down; } public void mousePressed(MouseEvent arg0) { JButton b=(JButton)arg0.getSource(); if(b==up){ c++; }else if(b==down){ c--; setText(c+""); public void mouseReleased(MouseEvent arg0) {} public void mouseClicked(MouseEvent arg0) {} public void mouseEntered(MouseEvent arg0) {} public void mouseExited(MouseEvent arg0) {} public class Listener2 { public static void main(String[] args){ JFrame jf=new JFrame("Hello"); jf.setSize(300, 100); JPanel panel=new JPanel(); jf.setContentPane(panel); JButton up=new JButton("Up"); JButton down = new JButton("Down"); CounterLabel3 counter=new CounterLabel3(0, up, down); up.addMouseListener(counter); down.addMouseListener(counter); panel.add(up); panel.add(counter); panel.add(down); jf.setVisible(true); } リスナー ポイントはリスナー側で,複数あるソースの情報を保持していること.

ココの情報保持があって,複数のボタン(ソース)の区別をしている. 第1回から抜粋 クラス図 ココの情報保持があって,複数のボタン(ソース)の区別をしている.

第1回から抜粋 前2つの例のクラス図 (再) 関連がない.

jarアーカイブ Eclipseが無くてもJ2SDK, JDKがなくても,JRE (Java Runtime Env.)があれば開発したアプリケーションを実行できる. 無論,クラスファイル全部をばらばらに配布しても良いのだが, 1つのファイルにまとめておいたほうが扱いやすい. そのためのアーカイブ形式が jar

やり方1

やり方 2