Animals サンプル Step 2 張り付けた動物の上をクリックすると それぞれの鳴き声で鳴く < 例外について > エラーや 通常の処理の中では起こってはいけない事象のことを例外といい 例外が起こる可能性がある場合はその対応処理を記述しなければならない 一般に java.lang パッケージの

Similar documents
Animals サンプル Step3 張り付けた動物の上をクリックすると それぞれの鳴き声で鳴く その鳴く間 一定時間 ( ここでは 1 秒間 ) 画像が別のものに変わる <アニメーションの基礎 : タイマーについて> アニメーションは アプリケーションが指定する間 一定間隔でどんどん画像をおきかえ

Animals サンプル Step 1 動物の種類を指定しておいて クリックした場所に画像を貼り付ける < レイアウトについて > 前回は ラベルやボタンの位置を座標で設定した Absolute Layout を選んだためである レイアウトは どのようにボタンなどのコンポーネントを配置するかを決定す

手書認識 グラフ描画 Step2-2 手書認識 : 認識結果を PaintPanel で描画する < 属性付き文字列 AttributedString> 標準出力では分かりにくいうえに認識結果を使えないので 認識するごとに PaintPanel に文字を描画することにする ここで 数式はただの文字列

(Microsoft PowerPoint - \223\306\217KJAVA\221\346\202R\224\ ppt)

PowerPoint Presentation

次の演習課題(1),(2)のプログラムを完成させよ

以下に java.awt.graphics クラスの主なメソッドを示す (Graphics クラスの ) メソッド drawline(int x1, int y1, int x2, int y2) drawrect(int x, int y, int width, int height) fillr

のようにする 上の例では GeneralPath を new するときに コンストラクタに何も指定していないが 直線を表す Line, 四角形を表す Rectangle などを引数に与えてもよい 矢印を作成するメソッドの引数矢印を表す GeneralPath を生成するために getarrowpat

Assignment_.java /////////////////////////////////////////////////////////////////////// // 課題 星の画像がマウスカーソルを追従するコードを作成しなさい 次 ///////////////////

Graphical User Interface 描画する

(Microsoft PowerPoint - \223\306\217KJAVA\221\346\202R\224\ ppt)

PowerPoint プレゼンテーション

ブロック崩し Step1 矢印キーで左右に動かせるパドルを描画する < パドルの表現方法 > パドルは java.awt パッケージの Rectangle という Java が用意しているクラスを使う これは四角形を表すクラスで 左上の点の座標と幅 高さをもっている (x, y) Rectangle

Prog2_10th

PowerPoint プレゼンテーション

2016 年度 JAVA 講座第六週目 目次 パッケージ... 2 パッケージの作成... 2 パッケージの使用方法... 3 異なるパッケージ同名クラスの宣言... 4 パッケージの側面から見たアクセス修飾子... 4 ラッパークラス... 5 ラッパークラス利用法:キャスト... 5 ラッパーク

PowerPoint Presentation

ÿþ˜u#u·0¹0Æ0à0


Java言語 第1回

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

I 4 p.2 4 GUI java.awt.event.* import /* 1 */ import mouseclicked MouseListener implement /* 2 */ init addmouselistener(this) this /* 3 */ this mousec

Prog2_9th

目 次 Java GUI 3 1 概要 クラス構成 ソースコード例 課題...7 i

オブジェクト指向プログラミング・同演習 5月21日演習課題

<4D F736F F F696E74202D AC C8899E D834F E >

Cir

GEC-Java

第1章 ビジュアルプログラミング入門

ガイダンス

ガイダンス

Javaセキュアコーディングセミナー2013東京第1回 演習の解説

Microsoft PowerPoint - prog09.ppt

Microsoft PowerPoint - prog09.ppt

新・明解Java入門

ガイダンス

I. (i) Foo public (A). javac Foo.java java Foo.class (C). javac Foo java Foo (ii)? (B). javac Foo.java java Foo (D). javac Foo java Foo.class (A). Jav

JAVA入門

教材ドットコムオリジナル教材 0から始めるiアフ リ リファレンス i アプリ簡易リファレンス ver i アプリ Java 独自のメソッド (1)iアプリの命令を使えるようにする import com.nttdocomo.ui.*; (2) 乱数を使う import java.u

ÿþ˜u#u·0¹0Æ0à0

データ構造とアルゴリズム論

Chapter JDK KeyListener keypressed(keyevent e ) keyreleased(keyevent e ) keytyped(keyevent e ) MouseListener mouseclicked(mouseeven

JAVA とテンプレート

try catch Exception Java try catch try { } catch ( Exception e ) { } e 16-1 try catch 0 try { int x = 0; int y = 10 / x; } catch ( Exception e ) { Sys

10/31 Java AWTの基本構造(Frameクラスの継承) 演習課題資料

人工知能入門

Java - Visual Editor

Microsoft PowerPoint - OOP.pptx

ガイダンス

PowerPoint プレゼンテーション

ガイダンス

Java講座

スライド 1

Microsoft Word - A05_AndroidプログラミングJUMP_画面800×1280

< F2D82B682E182F182AF82F12E6A7464>

Microsoft PowerPoint ppt

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

2

26 editor.putint(pref_count_key, executecount); 27 // 変更した Preference を確定させる 28 editor.commit(); 29 } (c) 実行の様子実装して実行した様子を図 1 と図 2 に示す. 一度実行するごとに, カウン

リファレンス,配列 例外処理

Java演習(4) -- 変数と型 --

KeyListener init addkeylistener addactionlistener addkeylistener addkeylistener( this ); this.addkeylistener( this ); KeyListener public void keytyped

問1

Microsoft PowerPoint - OOP.pptx

Javaセキュアコーディングセミナー東京 第2回 数値データの取扱いと入力値の検証 演習解説

GUI プログラミング第 4 Graph ~ 手書認識と関数グラフ描画 ~ マウスで数式を書いて認識し 関数グラフを描画する < 手書認識とグラフ描画のステップ> ステップ 1_1 フレームの作成 ステップ 1_2 マウスで自由に線を書く ステップ 2-1 手書認識認識結果を標準出力する ステップ

Prog2_12th

Prog1_15th

GUIプログラムⅣ

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

メソッドのまとめ

< F2D F B834E2E6A7464>

PowerPoint プレゼンテーション

JUnit 概要 2015/4/16 版今泉俊幸 2015 bbreak Systems 1

Prog2_9th

Prog1_11th

Java知識テスト問題

< F2D B838A835882CC8CF68EAE2E6A7464>

Microsoft PowerPoint prog1_doc2x.pptx

Microsoft PowerPoint - swing3.ppt


基本情報STEP UP演習Java対策

Make the Future Java FY13 PPT Template

ソフトウェア開発方法論2

Javaプログラムの実行手順

Microsoft PowerPoint - OOP.pptx

PowerPoint プレゼンテーション

Microsoft PowerPoint - prog03.ppt

Prog1_10th

Prog2_10th

第1章 ビジュアルプログラミング入門

Java言語 第1回

< F2D82518CC282CC D2E6A7464>

Brekeke PBX - Version 2.1 ARSプラグイン開発ガイド

プログラミング入門1

< F2D834F838C A815B A CC>

Prog2_10th

Microsoft PowerPoint - lec06 [互換モード]

文字列操作と正規表現

< F2D825282CC947B909482CC A815B83682E6A>

Transcription:

Step2 を始める前に 音声が鳴るかどうかを確かめます 手順 1. 共有フォルダにある SoundTest.jar を適当な場所にコピー 2.PC のミュートを外す 3. ディスプレイのボリュームボタンを 0 以上にする 4. コピーした SoundTest.jar をダブルクリック 5. サウンド再生 1 をクリックしてみる 6.5 で鳴らなかったら サウンド再生 2 をクリックしてみる 7.6 でも鳴らない人は教官に確認して PC を移動してみて下さい 移動の際にはボリュームを OFF にしていく 6 で初めてなった人は Step2 の MainPanel.java の play メソッドをテキストの通りではなく 以下のように書いてください * 音声再生メソッド * @param index * @throws Exception private void play(int index) throws MyException { // オーディオ入力ストリームを取得 AudioInputStream audiostream = AudioSystem.getAudioInputStream(audioFiles[index]); // オーディオ形式を取得 // AU AIFF WAVE 形式に対応している AudioFormat format = audiostream.getformat(); // データラインの情報 ( フォーマットなど ) を作成 DataLine.Info info = new DataLine.Info(SourceDataLine.class, format); // データラインの情報オブジェクトを生成 SourceDataLine line = (SourceDataLine) AudioSystem.getLine(info); // ラインを開く line.open(format); // ラインでのデータ入出力を可能にする line.start(); int nbytesread = 0; int EXTERNAL_BUFFER_SIZE = 128000; byte[] abdata = new byte[external_buffer_size]; while (nbytesread!= -1) { // オーディオストリームからデータを読み込み nbytesread = audiostream.read(abdata, 0, abdata.length); if (nbytesread >= 0) { // オーディオデータをミキサーに書き込み line.write(abdata, 0, nbytesread); // ラインからキューに入っているデータを排出 line.drain(); // ラインを閉じる line.close(); catch (Exception e) { throw new MyException(" 再生失敗 :"+e.getmessage(), e); -1-

Animals サンプル Step 2 張り付けた動物の上をクリックすると それぞれの鳴き声で鳴く < 例外について > エラーや 通常の処理の中では起こってはいけない事象のことを例外といい 例外が起こる可能性がある場合はその対応処理を記述しなければならない 一般に java.lang パッケージの Exception というクラスやそのサブクラスを使って次のように記述する Error というクラスもあるが これは メモリ不足などアプリケーションにとって非常に重大な問題のことで 例外処理では復旧できないため 記述されない int i = 0; int j = 1 / i ; // 0 で除算はできないので例外発生 System.out.println( 例外が発生するとこの行には到達しません ); catch (Exception e) { e.printstacktrace(); // 例外に関する情報を出力する 上の例で int 型の変数 i は 0 で初期化されているので j を計算することはできず Exception のサブクラスである ArithmeticException というクラスのオブジェクトが発生する 例外が発生すると その後の行は実行されることなく catch ブロックの中へとんで プログラムは終了する したがって 上の例では i に他の値を入れない限り System.out~ の行は実行されない 例外 Exception と関連の深いクラスの親子関係は以下の図であらわされる Throwable Error Exception RuntimeException < 作成手順 > 説明のためにコメントが多くあるが 必要以上書かなくてよい 1.RuntimeException のサブクラスとなる MyException を作成 本来は Exception の直接のサブクラスとするべきだが ツールのプレビュー表示にエラーが出るので RuntimeException にする animals パッケージを選択 新規 クラスを選択 名前は MyException スーパークラスの参照をクリックし RuntimeException の入力で出てくるクラスを選んで OK スーパークラスからのコンストラクタ にチェックをいれて 完了 必要な記述はすべて Eclipse が書いてくれるので 特に記述することはない 2.MainPanel クラスのソースに追加記述 ( MainPanel.java を参照 ) 3.AnimalsFrame クラスのソースに追加記述 ( AnimalsFrame.java を参照 ) 4. 実行する -2-

MyException.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 package animals; * このアプリ固有のException<br> * Exceptionが出た場合に 原因を限定しやすいので * すでにJavaにあるクラスExceptionを継承して作る <br> * ここでRuntimeExceptionというのは例外処理を必要としない特殊なExceptionなので * 本当はRuntimeExceptionでなくExceptionの直接のサブクラスでつくるべきだが * ツールのプレビュー表示にエラーが出るのでRuntimeExceptionにしている public class MyException extends RuntimeException { * 引数なしのコンストラクタ public MyException() { * コンストラクタその1<br> * メッセージを設定する * @param message public MyException(String message) { super(message); // 親クラスのコンストラクタの呼び出し * コンストラクタその2<br> * 原因となったエラーを設定する * @param cause public MyException(Throwable cause) { super(cause); * コンストラクタその3<br> * メッセージと原因となったエラーを設定する * @param message * @param cause public MyException(String message, Throwable cause) { super(message, cause); -3-

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 package animals; import java.awt.graphics; import java.awt.graphics2d; import java.awt.systemcolor; import java.awt.event.mouseevent; import java.awt.event.mouselistener; import java.io.file; import java.util.arraylist; import java.util.list; import javax.sound.sampled.audioformat; import javax.sound.sampled.audioinputstream; import javax.sound.sampled.audiosystem; import javax.sound.sampled.clip; import javax.sound.sampled.dataline; import javax.swing.imageicon; import javax.swing.joptionpane; import javax.swing.jpanel; import javax.swing.swingutilities; public class MainPanel extends JPanel implements MouseListener { private int animaltype = 0; // 動物の種類 private Animal clickedanimal = null; // クリックされた動物 private List<ImageIcon> images; // 動物の画像リスト private File[] audiofiles; // 音声ファイル private List<Animal> animals; // 動物のリスト private int imgwidth = 100; // 画像幅 private int imgheight = 100; // 画像高さ private int x,y; // クリックされた座標の一時保管用フィールド * コンストラクタ public MainPanel() { super(); // マウスイベントを受け取れるようにする addmouselistener(this); // 初期化 /* List は直接 new できず リストの種類を指定する必要がある * 普通に使う List は ArrayList で new すれば問題ない images = new ArrayList<ImageIcon>(); animals = new ArrayList<Animal>(); * ファイル数に応じて各インスタンスを初期化 * new したあと必ず呼ぶ * @throws MyException * Exception を発生させる可能性のあるメソッドには throws 節を付け加える public void init() throws MyException { // img ディレクトリを取得 /* File クラスはディレクトリを含むファイルの概念を表す * 相対パスで書くことができる File imgdir = new File("img"); -4-

61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 // img ディレクトリにあるファイルを配列にして全て取り出す File imgfiles[] = imgdir.listfiles(); // List に画像オブジェクトを追加 /* getabsolutepath 関数 : ファイルの絶対パスを String で返す for (int i=0; i<imgfiles.length; i++) { images.add(new ImageIcon(imgFiles[i].getAbsolutePath())); // サウンドファイルを sounds ディレクトリから取り出す audiofiles = (new File("sounds")).listFiles(); // 画像ファイルとサウンドファイルの数が合わなかったら Exception を発生させる if (imgfiles.length!= audiofiles.length) // MyException オブジェクトを新規生成して throw すると 例外発生となる throw new MyException(" 音声ファイルの数が合いません "); * 描画メソッド <br> * repaint 関数から呼ばれる public void paintcomponent(graphics g) { /* パネルにボタンなどが配置されているときのため * 今回は実際に意味はないが 慣例として忘れないよう書いておく super.paintcomponents(g); // より様々な描画方法が可能になるようにキャスト Graphics2D g2d = (Graphics2D)g; // システムカラー ( 背景色 ) を設定 g2d.setcolor(systemcolor.control); // 画面をいったんクリア g2d.fillrect(0, 0, this.getwidth(), this.getheight()); // 動物描画 /* Java5 からは可変長配列 List のループを以下ように書くことができる * animal には animals リストから順にとった Animal オブジェクトがはいる for (Animal animal : animals) { // 画像を描画 /* drawimage( 画像オブジェクト, x 座標, y 座標, 幅, 高さ, ImageObserver) * ImageObserver は画像のロードを通知するもの たいていは this でよい g2d.drawimage(images.get(animal.getanimaltype()).getimage(), animal.getcenterpoint().x-animal.getsize().width/2, animal.getcenterpoint().y-animal.getsize().height/2, animal.getsize().width, animal.getsize().height, this); * マウスクリックで呼ばれる関数 public void mouseclicked(mouseevent e) { // クリックされた座標を取得 x = e.getx(); y = e.gety(); int onimageindex = 0; // 画像上クリックなら index( 動物の種類 ), そうでなければ ListSize /* animals の中の Animal オブジェクトを順に見て クリックされた場所が * 動物画像の中に含まれるかどうかをみていく for (Animal animal : animals) { // 動物画像の中でクリックされていたらループから抜ける if (animal.contains(x, y)) break; -5-

121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 onimageindex ++; // 動物画像の中でクリックされていたら鳴き声を再生 if (onimageindex < animals.size()) { // クリックされた動物を取得 clickedanimal = animals.get(onimageindex); // 動物の種類に応じた鳴き声を再生 play(clickedanimal.getanimaltype()); catch (MyException ex) { // エラーをダイアログ表示 // JOptionPane.showMessageDialog( フレーム, メッセージ, タイトル, アイコンの種類 ) JOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(this), ex.getmessage(), " 再生エラー発生 ", JOptionPane.ERROR_MESSAGE); // 上と合わせて 1 行 // 動物画像の外でクリックされていたら画像を表示 else { // Animal オブジェクトを生成 Animal animal = new Animal(animalType, imgwidth, imgheight); // 中心座標を設定 animal.setcenterpoint(x, y); // リストに追加 animals.add(animal); // 再描画 repaint(); * 音声再生メソッド * @param index * @throws Exception private void play(int index) throws MyException { // オーディオ入力ストリームを取得 AudioInputStream audiostream = AudioSystem.getAudioInputStream(audioFiles[index]); // オーディオ形式を取得 // AU AIFF WAVE 形式に対応している AudioFormat format = audiostream.getformat(); // データラインの情報 ( フォーマットなど ) を作成 DataLine.Info di = new DataLine.Info(Clip.class, format); // 情報に基づいてラインを取得 // Clip はデータをメモリ上に読み込んでおいてから再生する Clip clip = (Clip) AudioSystem.getLine(di); // ラインを開く clip.open(audiostream); // ラインでのデータ入出力を可能にする clip.start(); // ラインからキューに入っているデータを排出 clip.drain(); catch (Exception e) { throw new MyException(" 再生失敗 :"+e.getmessage(), e); /* MouseListener を implements しているため * mouseclicked mouseentered mouseexited mousepressed mousereleased の * 4つとも記述しなければならないが このサンプルで使うのは -6-

181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 * mouseclicked だけなので後は空でよい public void mouseentered(mouseevent e) { public void mouseexited(mouseevent e) { public void mousepressed(mouseevent e) { public void mousereleased(mouseevent e) { * 動物の種類 setter * @param aimaltype public void setanimaltype(int animaltype) { this.animaltype = animaltype; AnimalsFrame.java ( 中略 ) mainpanel = new MainPanel(); // 例外処理を記述する mainpanel.init(); catch (MyException e) { // メッセージダイアログを表示する JOptionPane.showMessageDialog(this, e.getmessage(), " エラー ", JOptionPane.ERROR_MESSAGE); // プログラム強制終了 System.exit(-1); getcontentpane().add(mainpanel, BorderLayout.CENTER); ( 中略 ) -7-