#author("2018-04-20T04:59:58+00:00","ocha","ocha") *大学院HCI演習および人間機械系演習 2017年度後期 [#d515ca66] レポート提出者一覧(2017/2/10 12:00現在) - 1640640 - 1640648 - 1740648 - 1740649 - 1740651 - 1740654 - 1740656 - 1740657 - 1740658 - 1740661 - 1740663 - 1740666 - 1740667 - 1740669 - 1740670 - 1740671 - 1740673 *マルチメディアプログラミング実習 2017年度後期 [#s6662b38] 最終課題提出状況(2017/2/13 0:05現在) - 締め切りは2018年2月12日11:59pmです。締め切りました。 - 提出したファイルが以下のリストにあることを、タイムスタンプ、容量などで確認してください。 - 個人情報保護のために、ファイル名のローマ字名前部分と拡張子.zipを削除してあります。 - 提出ファイルが複数ある場合は、最新のタイムスタンプのファイルを提出物とみなします。 -rw-r--r-- 1 g1520531 2015 1959058 1 31 12:16 1520531 -rw-r--r-- 1 g1620501 2016 2867292 2 12 16:30 1620501 -rw-r--r-- 1 g1620501 2016 11535 1 25 15:17 1620501 -rw-r--r-- 1 g1620501 2016 158161 1 31 10:03 1620501 -rw-r--r-- 1 g1620502 2016 1705366 2 12 01:03 1620502 -rw-r--r-- 1 g1620502 2016 75624 1 25 15:13 1620502 -rw-r--r-- 1 g1620503 2016 639888 2 12 18:37 1620503 -rw-r--r-- 1 g1620504 2016 7203 1 31 12:42 1620504 -rw-r--r-- 1 siio isstaff 975720 2 11 19:23 1620504 -rw-r--r-- 1 g1620505 2016 394281 1 31 14:29 1620505 -rw-r--r-- 1 g1620505 2016 5883 1 25 15:10 1620505 -rw-r--r-- 1 g1620506 2016 7942 1 25 15:18 1620506 -rw-r--r-- 1 g1620506 2016 589047 2 12 22:36 1620506 -rw-r--r-- 1 g1620507 2016 121022 1 25 15:56 1620507 -rw-r--r-- 1 g1620507 2016 7698 1 25 15:08 1620507 -rw-r--r-- 1 g1620508 2016 485620 2 12 23:57 1620508 -rw-r--r-- 1 g1620509 2016 554405 1 31 09:47 1620509 -rw-r--r-- 1 siio isstaff 138515 2 7 23:27 1620510 -rw-r--r-- 1 g1620510 2016 3661 1 25 15:09 1620510 -rw-r--r-- 1 g1620512 2016 7338 1 25 15:09 1620512 -rw-r--r-- 1 g1620512 2016 400257 1 31 17:25 1620512 -rw-r--r-- 1 g1620513 2016 6185 1 25 15:18 1620513 -rw-r--r-- 1 g1620513 2016 299769 1 25 16:26 1620513 -rw-r--r-- 1 g1620515 2016 6499 1 25 15:09 1620515 -rw-r--r-- 1 g1620515 2016 24473 1 31 13:13 1620515 -rw-r--r-- 1 g1620515 2016 7263992 2 10 12:37 1620515 -rw-r--r-- 1 g1620516 2016 6400 1 25 15:12 1620516 -rw-r--r-- 1 g1620516 2016 662011 1 29 16:23 1620516 -rw-r--r-- 1 g1620517 2016 1919956 2 12 15:14 1620517 -rw-r--r-- 1 g1620517 2016 5062 1 25 15:10 1620517 -rw-r--r-- 1 g1620518 2016 6132 1 25 15:11 1620518 -rw-r--r-- 1 g1620518 2016 79306 1 31 18:30 1620518 -rw-r--r-- 1 g1620519 2016 236610 1 31 16:41 1620519 -rw-r--r-- 1 g1620520 2016 3133249 1 31 15:36 1620520 -rw-r--r-- 1 g1620520 2016 22480 1 25 15:14 1620520 -rw-r--r-- 1 g1620520 2016 3565943 2 11 22:50 1620520 -rw-r--r-- 1 g1620521 2016 738502 2 12 23:46 1620521 -rw-r--r-- 1 g1620521 2016 2748 1 25 15:10 1620521 -rw-r--r-- 1 g1620522 2016 1809823 1 31 12:53 1620522 -rw-r--r-- 1 g1620523 2016 159343 2 11 23:17 1620523 -rw-r--r-- 1 g1620524 2016 72674 1 31 13:15 1620524 -rw-r--r-- 1 g1620525 2016 15585 1 25 15:07 1620525 -rw-r--r-- 1 siio isstaff 1944614 2 12 12:16 1620525 -rw-r--r-- 1 g1620517 2016 775383 2 12 10:49 1620526 -rw-r--r-- 1 siio isstaff 859704 2 13 00:02 1620526 -rw-r--r-- 1 g1620526 2016 6755 1 25 15:10 1620526 -rw-r--r-- 1 g1620527 2016 6262 1 25 15:08 1620527 -rw-r--r-- 1 siio isstaff 959310 2 12 12:48 1620527 -rw-r--r-- 1 g1620528 2016 3437 1 25 15:15 1620528 -rw-r--r-- 1 g1620528 2016 6437 1 31 13:31 1620528 -rw-r--r-- 1 g1620528 2016 173177 1 31 13:36 1620528 -rw-r--r-- 1 g1620528 2016 453716 2 2 18:07 1620528 -rw-r--r-- 1 g1620529 2016 97337 1 26 17:37 1620529 -rw-r--r-- 1 g1620529 2016 4917 1 25 15:09 1620529 -rw-r--r-- 1 g1620530 2016 5106 1 25 15:09 1620530 -rw-r--r-- 1 g1620530 2016 137195 1 25 19:38 1620530 -rw-r--r-- 1 g1620530 2016 475383 1 31 15:29 1620530 -rw-r--r-- 1 g1620532 2016 4998 1 25 15:07 1620532 -rw-r--r-- 1 g1620532 2016 8526 1 31 18:10 1620532 -rw-r--r-- 1 g1620533 2016 7151181 2 12 09:10 1620533 -rw-r--r-- 1 g1620534 2016 5738 1 31 13:39 1620534 -rw-r--r-- 1 g1620535 2016 709957 1 31 13:03 1620535 -rw-r--r-- 1 g1620535 2016 725118 2 12 20:00 1620535 -rw-r--r-- 1 g1620536 2016 921047 2 11 00:55 1620536 -rw-r--r-- 1 g1620537 2016 16346 2 7 22:26 1620537 -rw-r--r-- 1 g1620537 2016 2276629 2 9 17:54 1620537 -rw-r--r-- 1 g1620537 2016 1086591 2 11 15:28 1620537 -rw-r--r-- 1 g1620537 2016 9933 1 25 15:08 1620537 -rw-r--r-- 1 g1620538 2016 2712 1 25 15:11 1620538 -rw-r--r-- 1 g1620539 2016 6203 1 25 15:25 1620539 -rw-r--r-- 1 siio isstaff 8629458 2 13 00:01 1620540 -rw-r--r-- 1 g1620540 2016 8781 1 25 15:09 1620540 -rw-r--r-- 1 g1620541 2016 189166 1 31 13:42 1620541 -rw-r--r-- 1 siio isstaff 592850 2 13 00:00 1620542 -rw-r--r-- 1 g1620542 2016 74631 1 25 15:08 1620542 **欠席状況 [#o4d380f5] 3/4以上出席してください。(欠席は3回まで)欠席4回で自動的に不可になります。 欠席3回以下なら不可にはなりませんが、成績が下がるかもしれませんので、心当たり無ければ連絡ください。 |学籍番号|10/5|10/12|10/19|10/26|11/2|11/9|11/16|11/23|11/30|12/14|1/18|1/25|欠席回数合計| |1520531|0|0|0|0|1|0|0|0|0|0|1|0|2| |1620501|0|0|0|0|0|0|0|0|0|0|0|0|0| |1620502|0|0|0|0|0|0|1|0|0|0|0|0|1| |1620503|0|0|0|0|0|0|0|0|0|0|0|0|0| |1620504|0|0|0|0|0|0|0|0|0|0|0|0|0| |1620505|0|0|0|0|0|0|0|0|0|0|0|0|0| |1620506|0|0|0|0|0|0|0|0|1|0|0|0|1| |1620507|0|0|0|0|0|0|0|0|0|0|0|0|0| |1620508|0|0|0|1|0|0|0|0|0|0|0|0|1| |1620509|0|0|0|0|0|0|0|0|0|0|0|0|0| |1620510|0|0|0|0|0|0|0|0|0|0|0|0|0| |1620512|0|0|0|0|0|0|0|0|0|0|0|0|0| |1620513|0|0|0|0|0|0|0|0|0|0|0|0|0| |1620515|0|0|0|0|0|0|0|0|0|0|0|0|0| |1620516|0|0|0|0|0|0|0|1|0|0|0|0|1| |1620517|0|0|0|0|0|0|0|0|0|0|0|0|0| |1620518|0|0|0|0|0|0|0|0|0|0|0|0|0| |1620519|0|0|0|0|0|0|0|0|0|0|0|0|0| |1620520|0|0|0|0|0|0|0|0|0|0|0|0|0| |1620521|0|0|0|0|0|0|1|0|1|0|0|0|2| |1620522|0|0|0|0|0|0|0|0|0|0|0|0|0| |1620523|0|0|0|0|0|0|0|0|0|0|0|0|0| |1620524|0|0|0|0|0|0|0|0|0|0|0|0|0| |1620525|0|0|0|0|0|0|0|0|0|0|0|0|0| |1620526|0|0|0|0|0|0|0|0|0|0|0|0|0| |1620527|0|0|0|0|0|0|0|0|0|0|0|0|0| |1620528|0|0|0|0|0|0|0|0|0|0|0|0|0| |1620529|1|0|0|0|0|0|0|0|1|0|0|0|2| |1620530|0|0|1|1|1|0|0|0|0|0|0|0|3| |1620532|0|0|0|0|0|0|0|0|0|1|0|0|1| |1620533|0|0|0|0|0|0|0|0|0|0|0|0|0| |1620534|0|0|0|0|1|0|0|0|0|0|0|0|1| |1620535|0|0|0|0|0|0|0|0|0|0|0|0|0| |1620536|0|0|0|0|0|0|0|0|0|0|0|0|0| |1620537|0|0|0|0|0|0|0|0|0|0|0|0|0| |1620538|1|0|0|0|0|0|0|0|0|1|0|0|2| |1620539|0|0|0|0|0|0|0|0|0|0|0|0|0| |1620540|0|0|0|0|0|0|0|1|0|0|0|0|1| |1620541|0|0|0|0|0|0|0|0|0|0|0|0|0| |1620542|0|0|0|0|0|0|0|0|0|0|0|0|0| **授業予定 [#m902f1d1] - 10月5日 授業 - 10月12日 授業 - 10月19日 授業 - 10月26日 授業 - 11月2日 授業 - 11月9日 授業 - 11月18日 授業 - 11月23日 授業(祝日だけど通常授業日) - 11月30日 授業 - 12月7日 休講(学会出張) - 12月14日 授業 - 12月21日 休講(椎尾通院) - 1月4日 自習 - 1月11日 休講(月曜授業日) - 1月18日 授業 - 1月25日 授業 ----------------------------------------------- *1月18日 [#fe5ee0e8] **宿題の提出 [#z9d4b2d3] 授業の最初に宿題を提出していただきます。 宿題の解答編です。 宿題ができなかった人は、これを見て、動かして、完成したものを、1月18日の授業開始時に提出お願いします。 年末に提出した人も、この時間にもう一度同じものを提出してください。 http://www.siio.jp/index.php?How2JavaAnime#sample ----------- *マルチメディアプログラミングの最終課題 [#fa431919] -課題:お絵描きプログラムを作成してさらに取扱説明書を作成して2月12日までに提出すること --この課題のヒントは SimpleDraw をみてください。 ** 提出課題として最低やってほしいこと [#hd791dc3] -ペンの太さをメニューで変えられるようにしてください -ペンの色をメニューとカラーパレットで変えられるようにしてください -消しゴム機能を追加してください -ウィンドウの大きさを変えても絵が消えてしまわないようにする (ダブルバッファを使う) ** 機能拡張:以下のことができれば加点します [#ibf935ab] -絵や写真のファイルを取り込めるようにする -いろいろな効果のペンを作る(たとえばペンの動きに従って文字が出る) -絵をファイルへ書き出す機能を作る -他の絵データをスタンプのように押す機能 -コピーアンドペースト -メニューバーだけでなく、スライダ、ボタン、別ウィンドウ(パレット)などを使って使いやすくする -そのほか、世の中のお絵描きプログラムにありそうな機能を実現する 機能拡張の詳細はSimpleDrawの -http://lab.siio.jp/index.php?SimpleDraw#extra を見てください。SimpleDrawのページでは、 -機能の拡充 -使いやすさの追求 の2通りの拡張を書いてあります。どちらの方針で進めていただいても結構です。 説明書に、工夫したところを書いておいてください。 ** 取扱説明書の作り方 [#j3398d0e] -ApplicationsからMicrosoft Office 2011/Microsoft Wordもしくは、テキストエディット(Text Edit)を選択して、これを使って、今回作成したプログラムの取扱説明書を書いてください。他のアプリで作ってもらっても良いですが、最後にPDFにしておいてもらえると助かります。 -せっかくですので作った機能はぜんぶここで説明してください。(プログラムは私も試してみますが機能を見逃すかもしれません) -スクリーンキャプチャした図も入れてください。図は次のようにして作ります --スクリーンキャプチャしたいところで、コマンド(リンゴマーク)+シフト+3を押します。すると画面全体のスクリーンショットがとれます --もしくは、コマンド(リンゴマーク)+シフト+4を押すとマウスドラッグで任意の場所の部分的なスクリーンショットがとれます --もしくは、コマンド(リンゴマーク)+シフト+4を押し、さらにスペースキーを押し、任意のウィンドウをクリックすると、そのウィンドウのスクリーンショットがとれます --以上の操作で、デスクトップにピクチャファイルができます。これをWordかText Editにドラッグアンドドロップします。 --もしくは、デスクトップのピクチャファイルをダブルクリックで開き、欲しい部分を矩形ツールで選択してコピーし、WordかText Editにペーストします -Control キーを押しながらキーボードショートカットを押すと、画像はファイルではなく、クリップボードに保存されるので、直後に書類にペーストできます。 -がんばったところ、大変だったところなどを書いていただいても結構です。また、できれば自力でやって欲しいのですが、だれかに教えてもらったり、web上のサンプルプログラムを参考にした場合は、そのことを説明書に書いてください。また、クラスメートににプログラムを教えた場合も、だれのどこを手伝ったかを書いておいてください。 ** 出来上がったプログラムの提出方法 [#i421b017] - フォルダを作ってその中にjavaファイルとclassファイルと、取扱説明書ファイルと、それ以外に必要なファイルがもしあればそれらを入れてください。フォルダの中のclassファイルをダブルクリックしたらプログラムが起動することを確認してください。 -このフォルダに名前を付けてください。フォルダの名前は、「出席番号+氏名(ローマ字の性か名)+必要ならばバージョン番号の数字」にしてください。 -このフォルダを圧縮してください -このフォルダを圧縮してください -圧縮したファイルを /home/isstaff/siio/Public/Drop Box/. に提出してください。ターミナル.appからなら cp 123456siioitiro.zip /home/isstaff/siio/Public/Drop\ Box としてください。ファインダーからなら、メニューから「移動」「フォルダへ移動...」を選んで 以下のように入力して、移動ボタンを押して、そこに現れるドロップボックスホルダに、ドラッグアンドドロップしてください。 http://siio.jp/gyazo/dropbox.png --書き込み専用なので確認できないけどokですかという意味のダイアログが出るかと思いますが問題ありません。 -レポート提出用フォルダは書き込み専用で見ることができません。アップロードできたかどうか不安でしたら教員まで質問してください。 -同じ名前のフォルダを投げ込むと、エラーになります。ということで新しいバージョンができたら別の名前のフォルダを作って提出し直してください。(フォルダ名最後に数字をつけてください) ** 締切 [#sc18de64] -締め切りは2018年2月12日11:59pmとします --この日までに提出してください //--どうしてもそのあともがんばりたい人は1月31日の11:59pmまでにsiio@mac.comまでメール添付で提出してください //--可能な限り差し替えます(見落とす可能性がありますので保証はできません) **以前の優秀作品例 [#t2007b9e] -http://siio.jp/pdf/2013/manual1.pdf -http://siio.jp/pdf/2013/manual2.pdf -http://siio.jp/pdf/2013/manual3.pdf -http://siio.jp/pdf/2013/manual4.pdf -http://siio.jp/pdf/2013/manual5.pdf ---------------- *12月14日 [#d982acc1] ***今日の課題 [#je4fb24c] SimpleDrawを、一筆書きにならないように変更してみてください。 .java、.classファイルを、 いつものように、出席番号+名前のフォルダに入れて、 zipで圧縮して提出してください。 ***冬休みの宿題 [#t63f401f] http://www.siio.jp/index.php?How2JavaAnime 宿題ができなかった人は、これを見て、動かして、完成したものを、1月18日の授業開始時に提出お願いします。年末に提出した人も、この時間にもう一度同じものを提出してください。 **終章 おまけ [#s65aaa02] ***マウスイベント [#cc8c3961] マウスイベントを受け取るには、Mouse ListenerやMouse Motion Listenerなどをインプリメントします。 以下のようにするとイベントをうけとれるます。 まずは何もしないウィンドウを作ってみましょう。 import java.awt.*; import javax.swing.*; import java.awt.event.*; public class MouseTest extends JFrame { public static void main(String[] args) { MouseTest test = new MouseTest(); test.setTitle("MouseTest"); test.setSize(400,300); test.setVisible(true); test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } 次にMouseListenerをインプレメントしてみましょう。 import java.awt.*; import javax.swing.*; import java.awt.event.*; public class MouseTest extends JFrame implements MouseListener { public void mouseClicked (MouseEvent e) { System.out.println("mouse clicked!"); } public void mouseEntered (MouseEvent e) { System.out.println("mouse entered!"); } public void mouseExited (MouseEvent e) { System.out.println("mouse exited!"); } public void mousePressed (MouseEvent e) { System.out.println("mouse pressed!"); } public void mouseReleased (MouseEvent e) { System.out.println("mouse released!"); } public static void main(String[] args) { MouseTest test =new MouseTest(); test.setTitle("MouseTest"); test.addMouseListener(test); test.setSize(400,300); test.setVisible(true); test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } 次にMouseMotionListenerをインプレメントしてみましょう。 public class MouseTest extends JFrame implements MouseListener, MouseMotionListener{ として、 public void mouseDragged(MouseEvent e) { System.out.println("mouse dragged!"); } public void mouseMoved(MouseEvent e) { System.out.println("mouse moved!"); } を作って、 test.addMouseMotionListener(test); をします。 解答編 import java.awt.*; import javax.swing.*; import java.awt.event.*; public class MouseTest extends JFrame implements MouseListener, MouseMotionListener{ public void mouseClicked(MouseEvent e) { System.out.println("mouse clicked!"); } public void mouseEntered(MouseEvent e) { System.out.println("mouse entered!"); } public void mouseExited(MouseEvent e) { System.out.println("mouse exited!"); } public void mousePressed(MouseEvent e) { System.out.println("mouse pressed!"); } public void mouseReleased(MouseEvent e) { System.out.println("mouse released!"); } public void mouseDragged(MouseEvent e) { System.out.println("mouse dragged!"); } public void mouseMoved(MouseEvent e) { System.out.println("mouse moved!"); } public static void main(String[] args) { MouseTest test = new MouseTest(); test.setTitle("MouseTest"); test.addMouseListener(test); test.addMouseMotionListener(test); test.setSize(400,300); test.setVisible(true); test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } *** 線を引く簡単なプログラム [#y4c3a992] JPanelのサブクラスを作りました。 import javax.swing.JPanel; import java.awt.Graphics; public class DrawPanel extends JPanel { public void drawLine(int x1, int y1, int x2, int y2){ Graphics g = this.getGraphics(); g.drawLine(x1, y1, x2, y2); } } こちらはメインのプログラム。JFrameのサブクラスで、これに上記のJPanelのサブクラスを貼付けてみましょう。 リスナーになっているので、こちらでマウスなどのイベントを受け取ります。 import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; import javax.swing.JFrame; public class SimpleDraw extends JFrame implements MouseMotionListener { int lastx=0, lasty=0, newx, newy; DrawPanel panel; public void mouseMoved(MouseEvent arg0) { } public void mouseDragged(MouseEvent arg0) { newx=arg0.getX(); newy=arg0.getY(); panel.drawLine(lastx,lasty,newx,newy); lastx=newx; lasty=newy; } private void init() { this.setTitle("Simple Draw"); this.setSize(300, 200); this.addMouseMotionListener(this); panel=new DrawPanel(); this.getContentPane().add(panel); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { SimpleDraw frame=new SimpleDraw(); frame.init(); } } ***Eclipseを使ってみよう [#vf7b5de5] http://gyazo.com/4383db7fb81f9eacbf5cc959ff77a33d.png -Eclipseの警告を消す方法 private static final long serialVersionUID = 42L; という変数を定義しておきます。 ***13.6節を読んで,プログラム13.6を実行してください [#k36e1b9b] 教科書203ページのプログラム13.6の5行めのところに、 ... implements ActionListener6: { とありますが、これは、 ... implements ActionListener { の間違いのようです。 *** 宿題提出 [#v1726950] プログラム12.4、プログラム13.1改造版、プログラム13.3、プログラム13.4を、 出席番号+名前のフォルダにいれて、ZIP圧縮して提出してください。 *11月30日の宿題 [#g174dc04] 12月14日の授業の時間に提出してください。 ***宿題1:プログラム12.4 [#sb6fece9] このプログラムに関する教科書の説明も読んでおいてください。 ***宿題2:プログラム13.1のようにボタンを配置して、それぞれを押すと、それぞれのボタンの名前が表示されるプログラムを作ってください。 [#f4fb000e] まずは、プログラム12.4を見て、上記のプログラムを拡張して5個のボタンに対応して, WEST, EAST, SOUTH, NORTH, CENTERと表示されるプログラムをつくってください。さらにこれを拡張して、プログラム13.1のようなボタンを配置して、それぞれを押すと、それぞれのボタンの名前が表示されるプログラムを作ってください。次回の授業で提出お願いします。 なお、以下のようにすると、ボタンの名前を印刷することができます。 public void actionPerformed(ActionEvent e){ System.out.println(((JButton)e.getSource()).getText()); } ***宿題3:プログラム13.3 [#d1f33bf7] このプログラムに関する教科書の説明も読んでおいてください。 ***宿題4:プログラム13.4 [#v34c2e1a] このプログラムに関する教科書の説明も読んでおいてください。 *11月30日 [#s0daa284] http://gyazo.com/4c3086ae9b6b5434d2ea741369f731c5.png このプログラムでは,ボタンを押しても何もおこりません. ボタンが押されたイベントを受け取るためには, +ActionListenerをimplementしたクラスを作る +そのインスタンスを作る +これをボタンにaddActionListener()で登録する 必要があります. プログラム12.3を参考に,ボタンを押したらprintlnで次のようなメッセージを表示するプログラムを作ってみましょう. http://gyazo.com/67d27d0588f4dd5d11410e1107165994.png ヒント(最初の6行です) import javax.swing.*; import java.awt.*; import java.awt.event.*; public class SimpleButton extends JFrame implements ActionListener { JButton button1, button2; public void initialize () { 解答例 import javax.swing.*; import java.awt.*; import java.awt.event.*; public class SimpleButton extends JFrame implements ActionListener { JButton button1, button2; public void initialize () { this.setTitle("私が作った最初の窓"); JPanel panel = new JPanel(); button1 = new JButton("button1"); button2 = new JButton("button2"); button1.addActionListener(this); button2.addActionListener(this); panel.add(button1); panel.add(button2); Container container = this.getContentPane(); container.add(panel); this.pack(); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void actionPerformed (ActionEvent e) { if(e.getSource()==button1) System.out.println("Hello"); else System.out.println("Goodbye"); } public static void main(String argv[]) { SimpleButton sw = new SimpleButton(); sw.initialize(); } } **第13章 様々なコンポーネントとレイアウト [#nfdf4f5e] ***プログラム13.1の説明図 [#ec2d7584] http://gyazo.com/649bbe400f96c8c31923bcf7e5aebbd4.png ***13.2節を読んで,プログラム13.2を実行させてください [#s05a9149] ボタンが一つしかないプログラムなので、ActionPerformedの中で、 ボタン種類のチェックを省略してしまっているところが特徴です。 ***演習13.1をやってください [#xc59c932] こんなのをつくってください。 http://gyazo.com/999f1e766551a994186cc3d159bde0bf.png BorderLayoutでもできるようですが、私はGridLayour使ってみました。 panel.setLayout(new GridLayout(2,2)); panel.add(textleft); panel.add(textright); panel.add(button); panel.add(clearbutton); ボタンが複数になるので、ActionPerformedの中で、ボタンを区別する必要があります。 解答例 import java.awt.*; import javax.swing.*; import java.awt.event.*; public class JTextFieldSample extends JFrame implements ActionListener { JButton button, clearButton; JTextField textleft, textright; JTextFieldSample(String title) { setTitle(title); button = new JButton("left to right"); clearButton = new JButton("clear"); button.addActionListener(this); clearButton.addActionListener(this); textleft = new JTextField(10); textright = new JTextField(10); JPanel panel=new JPanel(); panel.setLayout(new GridLayout(2,2)); panel.add(textleft); panel.add(textright); panel.add(button); panel.add(clearButton); Container container=this.getContentPane(); container.add(panel); } public void actionPerformed(ActionEvent e) { if(e.getSource()==(button)) { textright.setText(textleft.getText()); textleft.setText(""); }else if(e.getSource()==(clearButton)) { textright.setText(""); } } public static void main(String[] args) { JTextFieldSample sample = new JTextFieldSample("JTextFieldSample"); sample.pack(); sample.setVisible(true); sample.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } ***どのボタンからのイベントであるかを識別する方法 [#i076dba0] -プログラム12.3では --ボタンへの参照を、action Performedから参照できる変数に入れて --action Performedの中で、e.get Source()してButtonのインスタンスを得て比較している -プログラム12.4では、 --準備として button.set Action(button.get Text());でボタン文字をactionとして設定して -- action Performedの中で e.get Action Command()でアクションを得て文字比較している -ということで以下のようなことも可能です。 --acttion Performedの中で、get Source()してボタンを得る --そのボタンからget Textしてボタンの文字列を得て文字比較する --ただし、get Sourceで得られるのはボタンの親クラスなのでButtonにキャストする --以下をaction Performedのなかで試してみよう System.out.println(((JButton)e.getSource()).getText()); ***13.5節を読んで,プログラム13.5を実行してください [#o616a647] http://gyazo.com/dd4e103c011682b3a78b9ed0c8d5134b.png http://gyazo.com/4755cce7280963b32050db455d265cc1.png メニューアイテムにcommandという情報をつけて、ActionPerformedではこれを使ってメニュー項目を区別していま ***演習13.2をやってください(メニュー項目は何でも良いです) [#p9d1d369] ***本日のレポート [#o4524903] プログラム13.5もしくは、演習ができた人は、演習13.2のJMenuSample.javaとJMenuSample.classを、 出席番号+名前のフォルダにいれて、ZIP圧縮して提出してください。 ////////////////////////---------------- *11月23日 [#se6432ac] ***http://www.ocha.ac.jp/の内容を表示するプログラムを書いてみよう [#kf0c5bf6] http://gyazo.com/13044fdd9d372118a1f6fe93896eadb3.png ヒント1 import java.net.*; が必要です。 URL targetURL = new URL("http://www.ocha.ac.jp/"); でURLクラスのインスタンスが得られる。 InputStream istream = targetURL.openStream(); でこれからInputStreamのインスタンスが得られる。 InputStreamReader isreader = new InputStreamReader(istream); でこれからInputStreamReaderのインスタンスが得られる。 BufferedReader breader = new BufferedReader( isreader ); でこれからBufferedReader のインスタンスが得られる。 ヒント2 import java.io.*; import java.net.*; public class URLTest { public static void main (String argv[]) { try { ここにプログラムを書く } catch (IOException e) { System.out.println("error..."); } } } ヒント3: import java.io.*; import java.net.*; public class URLTest { public static void main (String argv[]) { try { URL targetURL = new URL("http://www.ocha.ac.jp/"); InputStream istream = targetURL.openStream(); InputStreamReader isreader = new InputStreamReader(istream); BufferedReader breader = new BufferedReader( isreader ); ここで一行ずつ読み込む } catch (IOException e) { System.out.println("error..."); } } } 解答例: import java.io.*; import java.net.*; public class URLTest { public static void main (String argv[]) { try { URL targetURL = new URL("http://www.ocha.ac.jp/"); InputStream istream = targetURL.openStream(); InputStreamReader isreader = new InputStreamReader(istream); BufferedReader breader = new BufferedReader( isreader ); String line; while((line=breader.readLine()) != null) System.out.println(line); } catch (IOException e) { System.out.println("error..."); } } } ***写真ファイルのダウンロード [#edb3e256] http://siio.jp/cat.jpg をダウンロードして、cat.jpgというファイルを作るプログラムを作ってください。 データはテキストじゃなくて、バイナリーです。 ヒント1: InputStreamのインスタンスに対してread()メソッドを使うと1バイトのデータが得られます。読み終わると-1になります。 1バイトのデータを書き出すなら、FileOutputStreamだけで可能です。 ヒント2: import java.io.*; import java.net.*; public class URLJpeg { public static void main (String argv[]) { try { URL targetURL = new URL("http://siio.jp/cat.jpg"); InputStream istream = targetURL.openStream(); FileOutputStream fout = new FileOutputStream("cat.jpg"); というインスタンスを作って、 istream.read() で読んで、 fout.write(1バイト) で書き出します。 解答例 import java.io.*; import java.net.*; //http://siio.jp/cat.jpg //をダウンロードして、cat.jpgというファイルを作るプログラム public class URLJpeg { public static void main (String argv[]) { try { URL targetURL = new URL("http://siio.jp/cat.jpg"); InputStream istream = targetURL.openStream(); FileOutputStream fout = new FileOutputStream("cat.jpg"); int aData; while((aData = istream.read()) != -1) fout.write(aData); istream.close(); fout.close(); } catch (IOException e) { System.out.println("error..."); } } } ***本日のレポート [#o4524903] 上記のプログラム(URLJpeg.java, URLJpeg.class) を、出席番号+名前のフォルダにいれて、ZIP圧縮して提出してください。 ***写真読み込みの高速化 [#ia7ce1f8] 上記の例では写真データを1バイトずつ読み書きしていました。 InputStreamのメソッドを調べると、複数バイト単位で読み込むメソッドがあります。 たとえば、512バイトずつ読み書きすることで、処理速度が向上すると期待できます。 そこで、複数バイト読み書きするよう、上記のプログラムを変更して、 実際にどの程度(実行速度にして何倍くらい)性能向上するか確認してみましょう。 read public int read(byte[] b) throws IOException 入力ストリームから配列長さだけのバイト数を読み込もうとし、それをバッファ配列 b に格納します。 実際に読み込まれたバイト数は整数として返されます。 戻り値は、バッファに読み込まれたバイトの合計数。ストリームの終わりに達してデータがない場合は -1 を使って読みこみ、 write public void write(byte[] b, int off, int len) throws IOException 指定された byte 配列の、オフセット位置 off から始まる len バイトを出力ストリームに書き込みます。 を使ってください。 -ヒント byte[] data = new byte[512]; という配列を用意して、 int datalength; while(( datalength=istream.read(data)) != -1) fout.write(data, 0, datalength); とします。 **第12章 Swing [#w5863135] ***とても簡単なウィンドウ [#r57b34f9] import javax.swing.JFrame; public class SimpleWindow { public static void main(String argv[]) { JFrame f = new JFrame("私が作った最初の窓"); f.setSize(200,100); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } } *** JFrameを継承するプログラミング [#y09a72d9] import javax.swing.JFrame; public class SimpleWindow extends JFrame { public void initialize () { this.setTitle("私が作った最初の窓"); this.setSize(200,100); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); } public static void main (String argv[]) { SimpleWindow sw = new SimpleWindow(); sw.initialize(); } } ***ラベルを表示するウィンドウ [#xedfffec] プログラム12.1を参考にして、上記の、継承を使ったプログラムによるウィンドウの中に、 Hello!という文字を出してみよう。 http://gyazo.com/c6efe47de19436f7564660377fe8b98c.png 解答例: import javax.swing.*; import java.awt.*; public class SimpleWindow extends JFrame { public void initialize () { this.setTitle("私が作った最初の窓"); JLabel label = new JLabel("Hello!"); Container container = this.getContentPane(); container.add(label); this.pack(); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String argv[]) { SimpleWindow sw = new SimpleWindow(); sw.initialize(); } } ***ボタンを2個表示するウィンドウ [#cb6cf696] プログラム12.2をみてください。 getContentPane()で得られたContainerに直接ボタンを貼付けることもできますが、 貼付けられるのは一つのボタンだけのようです。 そこで、JPanel (パネル) に2個のボタンを貼付け、それをContainerに貼付けることで複数のボタンを表示しています。 http://gyazo.com/03c28df2419065241b8736b7b69d7fd3.png プログラム12.2を参考にして、継承を使ったプログラムによるウィンドウの中に、 2個のボタンを出してみよう。 http://gyazo.com/4c3086ae9b6b5434d2ea741369f731c5.png ***本日2番目のレポート [#y0331e79] 上記のプログラム(SimpleWindow.java, SimpleWindow.class) を、出席番号+名前のフォルダにいれて、ZIP圧縮して提出してください。 解答例: import javax.swing.*; import java.awt.*; public class SimpleButton extends JFrame { public void initialize () { this.setTitle("私が作った最初の窓"); JPanel panel = new JPanel(); JButton button1 = new JButton("button1"); JButton button2 = new JButton("button2"); panel.add(button1); panel.add(button2); Container container = this.getContentPane(); container.add(panel); this.pack(); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String argv[]) { SimpleButton sw = new SimpleButton(); sw.initialize(); } } *11月16日 [#id92f2b1] ***Hash Mapの練習 [#jf7eb616] プログラム10.4を参考にして、 以下のように動作する英語ー日本語単語変換プログラムを作れ。 [e100:?/Documents/java] siio% java EtoJ banana バナナ [e100:?/Documents/java] siio% java EtoJ apple りんご [e100:?/Documents/java] siio% java EtoJ Please input an English word ヒント: ヒント: import java.util.*; public class EtoJ{ public static void main(String args[]) { HashMap<String,String> map = new HashMap<String,String>(); try { } catch(Exception e) { } } } 解答例: import java.util.*; public class EtoJ{ public static void main(String args[]) { HashMap<String,String> map = new HashMap<String,String>(); map.put("apple","りんご"); map.put("banana","バナナ"); map.put("orange","みかん"); map.put("pineapple","パイナップル"); map.put("grape","ぶどう"); map.put("peach","もも"); map.put("melon","メロン"); map.put("lemon","レモン"); try { System.out.println(map.get(args[0])); } catch(Exception e) { System.out.println("Please input an English word"); } } } **第11章 入出力 [#hb3a05b8] ***整数を出力する例 [#j899e2e7] import java.io.*; public class DoutTest { public static void main (String[] args) { try { FileOutputStream fout = new FileOutputStream("dout.dat"); DataOutputStream dout = new DataOutputStream(fout); dout.writeInt(100); dout.close(); }catch (Exception e) { System.out.println(e); } } } これでdout.datという名前のファイルができあがるはずです。 作ったファイルを od -h dout.dat または hexdump dout.dat してみてください e100:java siio$ hexdump dout.dat 0000000 00 00 00 64 0000004 ***整数を入出力する例 [#j899e2e7] import java.io.*; public class DoutTest { public static void main (String[] args) { try { FileOutputStream fout = new FileOutputStream("dout.dat"); DataOutputStream dout = new DataOutputStream(fout); dout.writeInt(100); dout.close(); FileInputStream finput = new FileInputStream("dout.dat"); DataInputStream dinput = new DataInputStream(finput); System.out.println(dinput.readInt()); dinput.close(); }catch (Exception e) { System.out.println(e); } } } ***宿題:演習11.1 をやってください [#z72d00c6] 作ったファイルを od -h dout.dat または hexdump dout.dat してみてください 解答例 import java.io.*; public class En111 { public static void main (String[] args) { int i; try { FileOutputStream fout = new FileOutputStream ("dout.dat"); DataOutputStream dout = new DataOutputStream(fout); for(i=1;i<101;i++) dout.writeInt(i); dout.close(); FileInputStream fin = new FileInputStream ("dout.dat"); DataInputStream din = new DataInputStream(fin); for(i=1;i<101;i++) System.out.println(din.readInt()); din.close(); } catch (FileNotFoundException e) { System.out.println(e); } catch (IOException e) { System.out.println(e); } } } ***プログラム11.3をやってみてください [#h15edee7] 作ったファイルを od -h または hexdump してみてください http://gyazo.com/74c061dfe2fcd6b72885878f867c78ba.png import java.io.*; public class PrintWriterTest{ public static void main(String[] args) { try { //writer.txtというファイルを作って文字を書き込む FileWriter fwriter = new FileWriter("writer.txt"); PrintWriter pwriter = new PrintWriter(fwriter); pwriter.println(2006); pwriter.println("Java教科書"); //fwriter.write("Java教科書"); pwriter.close(); } catch (IOException e) { System.out.println(e); } } } つぎに、プログラム11.4を参考にして、 このPrint Write Testに書き足して、 書き込んだデータを読み出して画面に表示するプログラムを作ってください。 ヒント: import java.io.*; public class PrintWriterTest{ public static void main(String[] args) { try { //writer.txtというファイルを作って文字を書き込む FileWriter fwriter = new FileWriter("writer.txt"); PrintWriter pwriter = new PrintWriter(fwriter); pwriter.println(2006); pwriter.println("Java教科書"); //fwriter.write("Java教科書"); pwriter.close(); ここに書き足す } catch (IOException e) { System.out.println(e); } } } ***文字ストリームをファイルに書いて読み込むプログラム [#bed8144f] import java.io.*; public class PrintWriterTest{ public static void main(String[] args) { try { //writer.txtというファイルを作って文字を書き込む FileWriter fwriter = new FileWriter("writer.txt"); PrintWriter pwriter = new PrintWriter(fwriter); pwriter.println("java 教科書" + 2001 ); pwriter.close(); //writer.txtのファイルの中身をSystem.out.printlnで表示する FileReader freader = new FileReader("writer.txt"); BufferedReader breader = new BufferedReader(freader); String tmp; while( (tmp=breader.readLine() ) != null) { System.out.println(tmp); } breader.close(); } catch (IOException e) { System.out.println(e); } } } ***プログラム11.5をやってこれを拡張して演習11.2をやってください [#ya1ca508] キーボードから1行入力された文字列によるテキストファイルを作る http://gyazo.com/f9aee7f492d574f870e85e2022df374c.png ヒント import java.io.*; public class En112 { public static void main(String[] args) { try { ここにプログラムを書く } catch(IOException e) { System.out.println(e); } } } これができたら、そのファイルを読み込んで表示する機能をさらに追加してください。 (FileReader, BufferedReaderを作ってrealLine()する) import java.io.*; public class En112 { public static void main(String[] args) { try{ InputStreamReader ireader = new InputStreamReader(System.in); BufferedReader breader = new BufferedReader(ireader); String line = breader.readLine(); System.out.println(line); breader.close(); FileWriter fwriter = new FileWriter("writer.txt"); PrintWriter pwriter = new PrintWriter(fwriter); pwriter.println(line); pwriter.close(); FileReader freader = new FileReader("writer.txt"); BufferedReader breader2 = new BufferedReader(freader); System.out.println(breader2.readLine()); breader2.close(); }catch(IOException e){ System.out.println(e); } } } **本日のレポート [#y5146699] En112.javaとclassを、出席番号+名前(ローマ字)のフォルダに入れて、圧縮して、提出してください。 /////////////////////////////////////////////////////////// *11月9日 [#c541167e] **第9章 エラーと例外処理 [#gd4f8eae] 次のプログラムを作って試してください。 引数が少ないとエラーが出るのを確認してください。 public class TestException { public static void main(String argv[]){ System.out.println(argv[0]+" "+argv[1]); System.out.println("Nice to meet you."); } } エラーが出る可能性のある場所をtryでくくっておき、 エラーが出たらそれを細くする処置をcatchで指定します。 public class TestException { public static void main(String argv[]){ try{ System.out.println(argv[0]+" "+argv[1]); System.out.println("Nice to meet you."); } catch (Exception e) { System.out.println("please input 2 words."); } } } このソースは、 public class TestString { public static void main (String argv[]) { try{ System.out.println(argv[0]); int len = argv[0].length(); for(int i = len - 1; i>=0; i--) { System.out.print(argv[0].charAt(i)); } System.out.println(); } catch (Exception e) { System.out.println("please input a word"); } } } である。 **第10章 Stringクラスとコレクションフレームワーク [#w938c6ce] ***引数の単語を表示するプログラムを作る [#wf6cf0b5] - 引数がないときは"please input a word"と出すようにする *** 入力した文字を逆に出力するプログラムを作る [#p6f8c354] [e100:?/Documents/java] siio% java TestString ochanomizu ochanomizu uzimonahco [e100:?/Documents/java] siio% ヒント:System.out.println()は改行するが、System.out.print()という関数は改行をしない ***Linked List の練習 [#d2a5cbd0] プログラム10.2を入力して実行してください。 サンプルプログラムを実行するときは、 LinkedList<String> list = new LinkedList<String>(); などと定義すると良い。 またコンパイルで注意が出るので、 javac -Xlint:unchecked LinkedListTest.java というオプションをつけてコンパイルしてみてください。 ***プログラム10.2 改造 [#j2f946c0] プログラム10.2の最後では、Iteratorを使って要素を全部表示しています。 これを教科書p.150のtoArray()メソッドでString配列を作ってfor each文で要素を印刷するように 書き換えてください。 ヒント: Alice --> Bob --> Cindy --> DaveというLinkedListをつくって、 それからtoArray()メソッドでString配列を作ってfor each文で要素を印刷する import java.util.*; public class LinkedListTest{ public static void main(String[] argv) { LinkedList<String> list = new LinkedList<String>(); list.add("Alice"); list.add("Bob"); list.add("Dave"); list.add("Cindy"); Object[] names = list.toArray(); for(Object s: names ) System.out.println(s); } } **本日のレポート [#y5146699] toArray()メソッドで一覧表示するよう改造したLinkedListTest.javaとlinkedListTest.classを、出席番号+名前(ローマ字)のフォルダに入れて、圧縮して、提出してください。 ------------ *11月2日 [#yf52838c] **第8章 継承 [#ka97b6ac] 継承の話をしました。 別のクラスを継承することで、 差分だけを書いて機能を拡張していくことができます。 http://gyazo.com/2c8ef14d8be63b9fc18c58d79f2f3879.png *** Osaifuクラスを継承してOsaifuUSDクラスを作ってみよう [#fc83e4ee] -OsaifuUSDクラスはアメリカで買い物をするときに便利な、アメリカドルでお金を出し入れできる財布です。 -あたらしく追加するメソッドは以下です -- void inUSD(int x) xドルをお財布に入金します。このとき円に換算して残高に追加します -- int outUSD(int x) xドルをお財布から出金します。このとき円に換算した金額だけ残高が減ります。戻り値はドルにしましょう。 --1ドルは114円にしてください //-スーパークラスのメソッドを上書きするメソッドは以下です //-- void print() お財布の残高を円とドルで表示します -OsaifuUSDクラスをテストするmain()メソッドでは次のことをやってください -- OsaifuUSDインスタンスを一つ作ってそれをsaifu1という名前にする -- OsaifuUSDインスタンスをもう一つ作ってそれをsaifu2という名前にする --saifu1に1000円入金する --saifu2に5ドル入金する --saifu1とsaifu2が持っている金額を印刷する --saifu1から2ドル出金してそれをsaifu2に入金する --saifu1とsaifu2が持っている金額を印刷する -動作例 http://gyazo.com/f51ea5895aaab32bb30b9a940d91515d.png -ヒント:一行目はこれ public class OsaifuUSD extends Osaifu { -ヒント:mainはこんな感じ public static void main(String argv[]) { OsaifuUSD saifu1= new OsaifuUSD(); OsaifuUSD saifu2=new OsaifuUSD(); saifu1.in(1000); saifu2.inUSD(5); saifu1.print(); saifu2.print(); saifu2.inUSD(saifu1.outUSD(2)); saifu1.print(); saifu2.print(); } -解答例 public class OsaifuUSD extends Osaifu { public int outUSD(int usd) { okane-=usd * 114; return usd; } public void inUSD(int usd) { okane+=usd * 114; } public static void main(String argv[]) { OsaifuUSD saifu1 = new OsaifuUSD(); OsaifuUSD saifu2 = new OsaifuUSD(); saifu1.in(1000); saifu2.inUSD(5); saifu1.print(); saifu2.print(); saifu2.inUSD(saifu1.outUSD(2)); saifu1.print(); saifu2.print(); } } *** OsaifuUSDクラスの改造(1) [#g8c0b7a2] 親のメソッドを活用しても良い public class OsaifuUSD extends Osaifu { public int outUSD(int usd) { return ( out( usd * 90) / 90 ); } public void inUSD(int usd) { in( usd * 90 ); } … } 親のメソッドを呼ぶことを明示的に書くためにsuper.をつかってもよい。 public class OsaifuUSD extends Osaifu { public int outUSD(int usd) { return ( super.out( usd * 90) / 90 ); } public void inUSD(int usd) { super.in( usd * 90 ); } … } *** OsaifuUSDクラスの改造(2) [#sa44f577] OsaifuUSDにprint()メソッドを追加して、 円表示の次の行に ( xxx USD ) と残高をUSD表示するようにしてください。 円表示を行う部分はスーパークラスOsaifuのインスタンスメソッドprint()を利用することを考えてみてください。 http://gyazo.com/39a7b24a8c45e15ac55693592c2eb7cf.png -解答例 public void print() { super.print(); System.out.println("( " + (okane / 114) + " usd )" ); } ***継承でウィンドウを作る [#m14bd7eb] 授業の最初に、こんなウィンドウを作るプログラムを紹介しました。 import javax.swing.JFrame; public class SimpleWindow { public static void main(String argv[]) { JFrame f = new JFrame("私が作った最初の窓"); f.setSize(200,100); // f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } } #ref(How2Java/simplewindow.png) これはSimpleWindowというクラスの中で、JFrameのインスタンスを作って表示しました。 これを、JFrameを継承したクラスを作り、 そのクラスの中で自分のインスタンスを作り表示することも可能です。 import javax.swing.JFrame; public class SimpleWindow extends JFrame { public static void main(String args[]) { SimpleWindow w = new SimpleWindow(); w.setSize(200,100); w.setVisible(true); } } Javaでは以下のように継承してウィンドウを作り、 その機能を拡張して、アプリケーションを作るのが一般的です。 import javax.swing.JFrame; public class SimpleWindow extends JFrame { void init() { this.setTitle("私が作った最初の窓"); //this.じゃなくてsuper.でもok this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setSize(200,100); this.setVisible(true); } public static void main(String args[]) { SimpleWindow w = new SimpleWindow(); w.init(); } } ***小テスト練習 [#g4c60a6e] 以下のプログラムの中で、 クラス、インスタンス、サブクラス、スーパクラス、クラスメソッド、インスタンスメソッドがどれであり、 インスタンス化、継承がどこで行われているのか確認してください。 (importで始まる一行目はまだ説明していない内容なので小テストでは扱いません。無視してください) import javax.swing.JFrame; public class SampleWindow extends JFrame { public static void main(String args[]) { SampleWindow w = new SampleWindow(); w.setVisible(true); } } **本日のレポート [#w02fe277] OsaifuUSD.javaとOsaifuUSD.classを、出席番号+名前(ローマ字)のフォルダに入れて、圧縮して、提出してください。 *10月26日 [#icc32449] -Point3Dに、他の点との距離を返すメソッド distance ( Point3D p ) を実装して、次のmain()メソッドで 10, 20, 30 -10, -20, -30 74.83314773547883 という結果が出るようにしましょう public static void main(String argv[]) { Point3D pt1 = new Point3D(); Point3D pt2 = new Point3D(); pt1.set(10, 20, 30);//インスタンス変数を設定 pt2.set(-pt1.getx(), -pt1.gety(), -pt1.getz()); pt1.print();//インスタンスメソッド呼出 pt2.print(); System.out.println(pt1.distance(pt2)); } --解答例 double distance ( int ptx, int pty, int ptz ) { int dx = ptx - this.x; int dy = pty - this.y; int dz = ptz - this.z; return Math.sqrt(dx * dx + dy * dy + dz * dz); } double distance ( Point3D p ) { return this.distance(p.getx(), p.gety(), p.getz()); } **第7章 クラスとオブジェクトの操作 [#k1b96e7b] *** 他の点との距離を返すメソッドの例を説明しました [#xfa5f246] double distance ( int ptx, int pty ) { int dx = ptx - this.x; int dy = pty - this.y; return Math.sqrt(dx * dx + dy * dy); } double distance ( Point p ) { return this.distance(p.getx(), p.gety()); } distanceという名前は同じでも、引数の違いで、異なる動作をさせることができます。 *** Osaifuクラスを作ってみよう [#i9df5c2e] -Osaifuクラスからはインスタンスがたくさん作られる --Osaifuクラスはお財布の設計図/工場、ここから実際のお財布(インスタンス)が複数作られる --工場出荷時の残金は0円だけど、その後、いろいろな値になるだろう(お金持ちのお財布には残金が多いだろうし、逆ならば少ないだろう) --ということで残金はインスタンス変数とすべきだろう -Osaifuクラスには次のメソッド、変数が必要だろう --残金を表すインスタンス変数 int okane --お金を入金するインスタンスメソッド void in(int x); --お金を出金するインスタンスメソッド int out(int x); 戻り値は実際に出金できた金額(残金が不足ならばあるだけしか出せない) --残金を印刷するインスタンスメソッドがあってもよいだろう void print(); &br; http://gyazo.com/bd6eaafd220dc7ff791288089f293b28.png -Osaifuクラスをテストするmain()メソッドでは次のことをやってください -- Osaifuインスタンスを一つ作ってそれをsaifu1という名前にする -- Osaifuインスタンスをもう一つ作ってそれをsaifu2という名前にする --saifu1に1000円入金する --saifu2に500円入金する --saifu1とsaifu2が持っている金額を印刷する --saifu1から200円出金してそれをsaifu2に入金する --saifu1とsaifu2が持っている金額を印刷する public static void main(String argv[]) { Osaifu saifu1 = new Osaifu(); Osaifu saifu2 = new Osaifu(); saifu1.in(1000); saifu2.in(500); saifu1.print(); saifu2.print(); saifu2.in(saifu1.out(200)); saifu1.print(); saifu2.print(); } http://gyazo.com/c618901458edc1ba338cab87d2810157.png -Osaifu.java 解答編 public class Osaifu { int okane; public void in (int x) { okane += x; } public int out(int x) { okane -= x; return x; } public void print() { System.out.println( "okane = " + okane +" yen"); } public static void main(String argv[]) { Osaifu saifu1 = new Osaifu(); Osaifu saifu2 = new Osaifu(); saifu1.in(1000); saifu2.in(500); saifu1.print(); saifu2.print(); saifu2.in(saifu1.out(200)); saifu1.print(); saifu2.print(); } } --このプログラムでは残金がマイナスになってしまってもかまわない設計になってしまっています。実際には残金だけの金額しか出せないはずなので、outメソッドを改良して、残金以上の金額を要求されたら、残金分だけしか出さないように変更してみてください。 --このためには、例えばoutメソッドを以下のようにすれば良い public int out(int x) { if(x < okane ) { okane = okane -x; return x; } else { int nokori = okane; okane =0; return nokori; } } *** つぎにOsaifuクラスにコンストラクタを追加してみよう [#a8a56d7e] -Osaifu() で残金0のインスタンスを作る -Osaifu(int x) で引数を残金の初期値としたインスタンスを作る ことができるコンストラクタを作ろう。 これをmainから呼んで、上記のプログラムと同じことをするためには、 Osaifu saifu1 = new Osaifu(1000);//インスタンスを作る //最初の保持金額を1000円にする Osaifu saifu2 = new Osaifu(500);//インスタンスを作る //最初の保持金額を500円にする とすることになる。 ***コンストラクタ解答編 [#w62499a7] 以下のコンストラクタを作ることになる。 Osaifu() { okane = 0; } Osaifu(int x) { okane = x; } これは以下のように書いても良い。 Osaifu() { this(0); } Osaifu(int x) { okane = x; } **本日のレポート [#taf5ddf5] Osaifu.javaとOsaifu.classを、出席番号+名前(ローマ字)のフォルダに入れて、圧縮して、提出してください。 *10月19日 [#p32c04e4] **第5章(つづき) [#j26db0b3] ***for-each文は新しい手法なので練習しましょう [#s17e2f54] -プログラム5.7の代わりに以下をやってみよう class ArrayTest { public static void main (String args[]) { int[] vec = new int[3]; vec[0]=1; vec[1]=2; vec[2]=3; for (int x: vec) { System.out.println(x); } } } *** 演習 [#vc946bd9] mainの引数argsは、Stringの配列で、コマンドラインで起動したとき、 コマンドの後に続けた書いた文字が入っています。 args[0], args[1], args[2] .... をすべてfor-each文で 表示するプログラムを書いてみましょう。 http://gyazo.com/8d8effac163e0dc939e74f237d8507b1.png ヒント:for(String s: args)を使います -解答例 class ArgsTest2 { public static void main (String args[]) { for(String s: args) System.out.println(s); } } ----- -演習問題5.5をwhile文を使ってやってみよう http://gyazo.com/1733defca0c709c41c69ea729320ab61.png -演習5.6をやってみよう while文をfor文に変えてみる -現在の普通預金の金利0.001%だと倍になるのに何年かかるだろうか。確かめてみよう。 できた人から2:30pmまで休憩してください。 **第6章 クラスの基礎 [#bd0963ec] ***クラスとインスタンスの説明をしました [#gc6def4c] -クラスは型、インスタンスはそれから作られたもの --クラスがたいやきの焼き型だとすると、インスタンスはそれから作られたたいやき --クラスは設計図でインスタンスはそれから作られたもの -クラスとインスタンスそれぞれにメソッドと変数がある --クラス変数 例:何個のインスタンスを作ったか? --クラスメソッド 例:インスタンスを作れ --インスタンス変数 例:ひとつのたいやきの重さ --インスタンスメソッド 例:たいやきをxxグラム食べる http://gyazo.com/bbdd3587977a172f7fa7f00c4f5787e0.png -演習問題6.1, 6.2, 6.3 例えば以下のような実行結果が出るようにしてください http://gyazo.com/deeb78a70a724a01ce76945235d42ab8.png ***public static void main の説明をしました [#p8e5e198] -javaコマンドは、引数のクラスのクラスメソッドmainを実行します --staticと付いているのがクラス変数、クラスメソッドの印です -Pointクラスにクラスメソッドmainを実装すれば自分自身をテストできます -クラスPoint3Dに自分自身をテストするクラスメソッドmainを作ってみよう http://gyazo.com/bdef2ab8e69f7f6e62273c2d67d7af2e.png ***変数にはメソッド経由でアクセスするのが良いという説明をしました [#c813a888] -変数の型などを将来変更してもメソッドの書き換えで対応できます public class Point { private int x, y; void set(int newx, int newy) {x=newx; y=newy;} int getx() { return x;} int gety() { return y;} void print () { System.out.println(x + ", " + y); } public static void main(String argv[]) { Point pt1= new Point(); Point pt2 = new Point(); pt1.set(10,20); pt2.set(-pt1.getx(), -pt1.gety()); pt1.print(); pt2.print(); } } -Point3Dのメソッドを充実させて次のmain()メソッドで 10, 20, 30 -10, -20, -30 という結果が出るようにしましょう public static void main(String argv[]) { Point3D pt1 = new Point3D(); Point3D pt2 = new Point3D(); pt1.set(10, 20, 30);//インスタンス変数を設定 pt2.set(-pt1.getx(), -pt1.gety(), -pt1.getz()); pt1.print();//インスタンスメソッド呼出 pt2.print(); } **本日のレポート [#taf5ddf5] Point3D.javaとPoint3D.classを、出席番号+名前(ローマ字)のフォルダに入れて、圧縮して、提出してください。 *10月12日 [#r5f257e7] **第3章 [#xc22f04b] -演習 --演習3.4をみて、自分の名前の最初の文字の文字コードを表示してみてください。 --arg[0]とarg[1]をprintlnの中で+でつないで表示する http://gyazo.com/8159f78165e17781a7110de3763c833c.png ヒント class ArgsTest { public static void main (String args[]) { System.out.println(args[0]); } } 解答 class ArgsTest { public static void main (String args[]) { System.out.println(args[0] + " + " + args[1]); } } **第4章 [#f2e95643] --演習4.2をやってみよう **第5章 [#p54c6568] ***演習 [#leda55b3] -演習問題5.4(変更) 乱数を10個表示する public class Score { public static void main (String argv[]) { int i,a; for(i=0;i<10;i++) { a=(int)(Math.random() * 100); System.out.println(a); } } } 次にこの乱数を点数とみなして、演習問題5.4の基準に従ってABCDEを表示するプログラムを書け。 動作例を以下に示す。 http://gyazo.com/829b04a7fc82cdfe9dd0dfa650af873e.png 解答例: public class Score { public static void main (String argv[]) { int i,a; for(i=0;i<10;i++) { a=(int)(Math.random() * 100); System.out.print(a + " "); if(a<40) System.out.println("D"); else if(a<60) System.out.println("C"); else if(a<80) System.out.println("B"); else System.out.println("A"); } } } **本日のレポート [#taf5ddf5] Score.javaとScore.classを、出席番号+名前(ローマ字)のフォルダに入れて、圧縮して、提出してください。 //----------------------------------------------------------- *10月5日 [#k1f7eb81] **javaのマニュアル [#beafbfad] //http://sdc.sun.co.jp/java/docs/j2se/1.5.0/ja/docs/ja/api/index.html //http://java.sun.com/javase/ja/6/docs/ja/api/index.html //http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/index.html http://docs.oracle.com/javase/jp/8/docs/api/index.html ***教科書 [#a7e1ce26] http://gyazo.com/de3288074dae1c75f6df4ef3c0b9b3d4.png http://www.amazon.co.jp/dp/4883732258/ 買ってください。もしくは、先輩から安く譲ってもらってください。 *** この講義の目的 [#l5592b29] +Javaでプログラムする +オブジェクト指向の概念を理解してプログラミングする +GUIプログラミングをする *** この講義の順序 [#gcf48d66] +Javaになれる(C言語などのプログラミング手法の復習) +オブジェクト指向について理解する +GUIプログラミングについて理解する(イベント駆動) +お絵描きプログラムを作ってみる *** 成績評価 [#c732dbb9] +欠席は3回までです。欠席4回で自動的に不可になります。公欠、病欠は欠席にカウントしません。 +お絵描きプログラムの完成度,作り込み +毎回の宿題の達成(参考程度) +出席状況(欠席回数で減点します) +成績は研究室配属にも考慮します(予定) **第1章および第2章 [#y3ae1beb] *** macOSでJavaを使う [#g3e7de3f] macOSはJavaと相性が良く、最初からjavaがインストールされています。 ということでWindowsより簡単に(というか何もしなくても)javaが使えます。 *** terminalを起動する [#ia8beba9] //#ref(How2Java/terminal.png) http://siio.jp/gyazo/7366bfab668207c6598c4d88ef70d2d4.png - terminalは、/Applications/Utilities/の中にあります。 ちなみに、/Applicationsはファインダでは/アプリケーションと日本語として見えます。 /Applications/Utilities/は、/アプリケーション/ユーティリティ/と日本語として見えています。 - ダブルクリックすると起動します。 よく使うことになると思いますので、dockにドラッグアンドドロップして 登録しておくと良いかと思います。 //- メニューのターミナル/環境設定...を開きます。 //ここで、テキストを選んで、「テキストをアンチエイリアス処理」に //チェック入れておくとフォントが奇麗なのでおすすめです。 // //http://siio.jp/gyazo/8aa6f5ab8878bc57c0657b94f5ae7a58.png //- おなじウィンドウの「詳細」に、「文字エンコーディング」というのがあります。 //Javaの場合、ここで「Unicode (UTF-8)」を選んでおきましょう。 //(日本語コードにはいろいろな種類があって混乱しますが、21世紀に生きるみなさんはUnicodeで統一していきましょう) //http://gyazo.com/1b36039be113ef9e8ed04842aaeb3da6.png - ターミナルから、javacとタイプしてみてください。Javaがすでに入っているので、 オプションの説明が日本語で出てくると思います。 --最近のmacOSでは、Javaが標準で入っていない場合もあります。 その場合は、ダインロードするかどうか聞かれますので、ダウンロードしましょう。 //--ここでの日本語表示が化けていたら、javaがUnicodeじゃなくてShift-JISなどのコードで動いていることになります。タ//ーミナルをShift-JISなどに設定しても良いのですが、ここは、JavaをUnicodeで動かすようにしましょう。 //-JavaをUnicodeで動かす(前項で文字化けした場合の対処) //--javacを起動するときに、javac -J-Dfile.encoding=UTF-8 とオプションを付けます //--javaを起動するときには、java -Dfile.encoding=UTF-8 とオプションを付けます。 //--面倒なので、.bash_profileに登録しておきましょう //-- ~/.bash_profileを開いて以下の行を追加します // alias javac='javac -J-Dfile.encoding=UTF-8' // alias java='java -Dfile.encoding=UTF-8' *** テキストエディタを用意しておく [#qfba9e5b] //http://siio.jp/gyazo/2c0e58d1b83d396e1fbe6f5d247670ff.png - Javaのプログラムを作るエディタです。一番簡単にはterminalからviとかemacsとかpicoとかタイプして エディタを呼び出せば良いです。 - でも日本語の設定などが結構難しいので、GUIベースのエディタを使ってみましょう。 - いくつかありますが、椎尾のおすすめの一つはCotEditorという、便利なフリーウェアのテキストエディタです。 - CotEditorを使うには、https://coteditor.comからダウンロードして~/Applicationsにコピーします。 - これも便利なのでdockに入れておくとよいと思います。 //http://siio.jp/gyazo/7579915fefe1ecd9c0e4e2ddfa55177d.png *** 超簡単なプログラム(hello world)を作ってみる [#v4ccc293] - ターミナルから、vi Hello.javaとかemacs Hello.javaとかpico Hello.javaとかタイプしたり、 もしくは、他のエディタを起動してファイル/新規/javaを選んで新しいファイルを作って開きます。 - ここで、以下のようなプログラムを書いてみます。 class Hello { public static void main (String args[]) { System.out.println("hello java world!"); } } //-このときmiで改行コードをLF (UNIX)にしておいてください。またUTF-8になっていれば日本語も正しく出るはずです。 // //http://siio.jp/gyazo/20121004010107.png - これをHello.javaという名前で保存して、コンパイル実行します。すると以下のようになります。 javac Hello.java (コンパイルする) java Hello (実行する。.javaなどの拡張子は不要) hello java world! (結果) - 次に簡単なウィンドウを出してみましょう。 授業の最後の方で紹介する,Swingというフレームワークを使ってウィンドウを出してみます. import javax.swing.JFrame; public class SimpleWindow { public static void main(String argv[]) { JFrame f = new JFrame("私が作った最初の窓"); f.setSize(200,100); // f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } } これをSimpleWindow.javaという名前で保存して、 javac SimpleWindow.java java SimpleWindow とタイプしてコンパイル/実行します。 このプログラムは,ウィンドウのクローズボタンを押しても終了しません. プログラムを停止するには,ターミナルでコントロール-cを押します. #ref(How2Java/simplewindow.png) ** 出来上がったプログラムの提出方法 [#bd9cbbf8] - フォルダを作ってその中にjavaファイルとclassファイル //と、取扱説明書ファイルと、それ以外に必要なファイルがもしあればそれら を入れてください。 フォルダの中のclassファイルをダブルクリックしたらプログラムが起動することを確認してください。 -このフォルダに名前を付けてください。フォルダの名前は、「出席番号+氏名(ローマ字の姓名)+必要ならばバージョン番号の数字」にしてください。たとえば09020999siioitiro01のように。なお全部半角英数字でお願いします。 -このフォルダを圧縮してください --フォルダを選択してファイルメニューから圧縮を選択します -圧縮したファイルを以下の手順で /home/isstaff/siio/Public/Drop Box/. に提出してください。ターミナル.appからなら cp 123456siioitiro.zip /home/isstaff/siio/Public/Drop\ Box としてください。ファインダーからなら、メニューから「移動」「フォルダへ移動...」を選んで 以下のように入力して、移動ボタンを押して、そこに現れるドロップボックスホルダに、ドラッグアンドドロップしてください。 http://siio.jp/gyazo/dropbox.png --書き込み専用なので確認できないけどokですかという意味のダイアログが出るかと思いますが問題ありません。 -レポート提出用フォルダは書き込み専用で見ることができません。アップロードできたかどうか不安でしたら教員まで質問してください。 //-授業中でしたら、[[ココを見ると:http://siio.jp/lecture/java_report.html]]一覧をみることができます。 -同じ名前のフォルダを投げ込むと、エラーになります。ということで新しいバージョンができたら別の名前のフォルダを作って提出し直してください。(フォルダ名最後に数字をつけてください) **レポート提出方法 [#ac87d6ac] /home/isstaff/siio/Public/Drop Box/. に提出してください。ターミナル.appからなら cp 123456siioitiro.zip /home/isstaff/siio/Public/Drop\ Box としてください。ファインダーからなら、メニューから「移動」「フォルダへ移動...」を選んで 以下のように入力して、移動ボタンを押して、そこに現れるドロップボックスホルダに、ドラッグアンドドロップしてください。 http://siio.jp/gyazo/dropbox.png