ヒューマンインタフェース2019年度前期

マルチメディアプログラミング実習 2018年度後期

最終課題提出状況(2019/2/5 10時12分現在)

これで締め切りとします。タイムスタンプとサイズを確認してください。提出に失敗しているようでしたら椎尾、siio@is.ocha.ac.jp までメール添付で提出してください。

g1520520  2015   142K  2  4 10:59 1520520suzukiaki13.zip
g1720501  2017   992K  2  3 20:02 1720501akiyamahinano.zip
g1720502  2017   758K  2  1 21:19 1720502iinosaki12.zip
g1720503  2017   461K  2  1 20:11 1720503IshijimaMisaki12.zip
g1720504  2017   1.2M  2  3 22:13 1720504manaishida_final.zip
g1720505  2017   1.0M  2  4 10:27 1720505itomika.zip
g1720506  2017   2.9M  1 30 09:57 1720506enta.zip
g1720507  2017   116K  2  2 14:44 1720507otaniyumi.zip
g1720507  2017   122K  2  2 14:46 1720507otaniyumi01.zip
g1720508  2017   770K  1 31 16:04 1720508_OgasawaraNodoka.zip
g1720509  2017   326K  1 31 14:08 1720509ogawasawako.zip
g1720511  2017   382K  2  3 23:44 1720511KawanishiMami.zip
g1720512  2017   416K  2  3 14:01 1720512Kimura.zip
g1720513  2017    98K  2  4 18:37 1720513kusuhata.zip
g1720514  2017   452K  2  3 20:36 1720514goto.zip
g1720515  2017   3.2K  2  3 20:50 1720515sakatayurie.zip
g1720517  2017   1.5M  2  1 17:40 1720517 satonanami.zip
g1720519  2017   3.7M  1 29 15:36 1720519shimizugawa.zip
g1720520  2017   7.3M  2  3 16:36 1720520shinakane.zip
g1720521  2017   237K  2  3 20:58 1720521JinnoRiko.zip
g1720522  2017   137K  2  4 11:45 1720522suzukiharuka.zip
g1720524  2017   2.1M  2  4 10:23 1720523.zip
g1720524  2017   1.0M  2  4 10:23 1720524.zip
g1720525  2017   1.7M  2  3 21:54 1720525takanosaki.zip
g1720527  2017   766K  2  4 12:03 1720527 Taguchi Haruka.zip
g1720528  2017   215K  2  2 18:52 1720528Tsuruoka01.zip
g1720528  2017   775K  2  4 11:57 1720528Tsuruoka02.zip
g1720529  2017   537K  2  2 17:44 1720529toriyamanamiko.zip
g1720530  2017   101K  2  4 11:21 1720530nakato0204.zip
g1720531  2017   217K  2  3 20:46 1720531HagaTomoe_Simpledraw.zip
g1720532  2017    60K  2  4 11:49 1720532hayashidarika.zip
g1720533  2017   432K  1 28 15:32 1720533haradahonoka.zip
g1720534  2017   9.6M  2  4 12:03 1720534BitohKana.zip
g1720534  2017   9.6M  2  4 12:21 1720534BitohKana02.zip
g1720535  2017   264K  1 31 23:03 1720535hiroeayano_last.zip
g1720536  2017   147K  2  3 20:12 1720536fukayashiho.zip
g1720537  2017   821K  1 29 14:58 1720537fujiimaika.zip
g1720538  2017   1.0M  2  3 21:18 1720538hondakaholhw.zip
g1720538  2017   1.0M  2  3 21:50 1720538hondakaho完成版.zip
g1720539  2017   138K  2  3 23:23 1720539tatsushita.zip
g1720540  2017   780K  2  2 22:26 1720540RunaMatsumoto2.zip
g1720540  2017   780K  2  2 22:20 1720540RunaMtsumoto1.zip
g1720541  2017   204K  2  4 11:38 1720541MurakamiAyana.zip
g1720541  2017   214K  2  4 11:43 1720541MurakamiAyana2.zip
g1720542  2017   600K  2  3 15:53 1720542YutaniAyaka.zip
g1720542  2017   600K  2  3 15:58 1720542YutaniAyaka03.zip
g1720543  2017   8.5M  2  4 10:26 1720543_watanabe.zip
g1740665  2013   882K  2  4 11:34 1740665minakawaakiko.zip
g1740665  2013   881K  2  4 11:52 1740665minakawaakiko_02.zip
g1720510  2017    17M  2  3 14:37 g1720510oritayukimiSimpleDraw.zip
g1720516  2017   2.0M  2  4 08:48 g1720516momosasaki.zip
g1720526  2017   175K  2  3 13:45 g1720526SimpleDraw.zip

出席表明アプリケーション

b1128c100d39263a8480428af2d05da0.png
  • 初めて起動する時は、右クリックして、「開く」ボタンを選んでください。

2019年1月10日

今後の予定

  • 1月10日(実質最後の授業)
  • 1月17日(海外出張で自習。演習室は公開します。TAが待機します。出欠はとりません。)
  • 1月24日 (補講・試験期間のため授業なし。自習。演習室は公開します。TAが待機します。出欠はとりません。)

Eclipseを使ってみよう

http://gyazo.com/4383db7fb81f9eacbf5cc959ff77a33d.png

  • Eclipseの警告を消す方法
	private static final long serialVersionUID = 42L;

という変数を定義しておきます。

一筆書き解消

上で紹介したSimple Drawを、一筆書きにならないように変更してみてください。

ずれの解消

ポインタ位置と描画位置がずれる問題を解決してください。

今後の課題

こちらに続きを書いてあります。これを見ながら改良を進めてください。

http://www.siio.jp/index.php?SimpleDraw

マルチメディアプログラミングの最終課題

  • 課題:お絵描きプログラムを作成してさらに取扱説明書を作成して2月4日正午までに提出すること
    • この課題のヒントは SimpleDraw をみてください。

提出課題として最低やってほしいこと

  • ペンの太さをメニューで変えられるようにしてください
  • ペンの色をメニューとカラーパレットで変えられるようにしてください
  • 消しゴム機能を追加してください
  • ウィンドウの大きさを変えても絵が消えてしまわないようにする (ダブルバッファを使う)

機能拡張:以下のことができれば加点します

  • 絵や写真のファイルを取り込めるようにする
  • いろいろな効果のペンを作る(たとえばペンの動きに従って文字が出る)
  • 絵をファイルへ書き出す機能を作る
  • 他の絵データをスタンプのように押す機能
  • コピーアンドペースト
  • メニューバーだけでなく、スライダ、ボタン、別ウィンドウ(パレット)などを使って使いやすくする
  • そのほか、世の中のお絵描きプログラムにありそうな機能を実現する

機能拡張の詳細はSimpleDraw

を見てください。SimpleDrawのページでは、

  • 機能の拡充
  • 使いやすさの追求

の2通りの拡張を書いてあります。どちらの方針で進めていただいても結構です。 説明書に、工夫したところを書いておいてください。

取扱説明書の作り方

  • ApplicationsからMicrosoft Office 2011/Microsoft Wordもしくは、テキストエディット(Text Edit)を選択して、これを使って、今回作成したプログラムの取扱説明書を書いてください。他のアプリで作ってもらっても良いですが、最後にPDFにしておいてもらえると助かります。
  • せっかくですので作った機能はぜんぶここで説明してください。(プログラムは私も試してみますが機能を見逃すかもしれません)
  • スクリーンキャプチャした図も入れてください。図は次のようにして作ります
    • スクリーンキャプチャしたいところで、コマンド(リンゴマーク)+シフト+3を押します。すると画面全体のスクリーンショットがとれます
    • もしくは、コマンド(リンゴマーク)+シフト+4を押すとマウスドラッグで任意の場所の部分的なスクリーンショットがとれます
    • もしくは、コマンド(リンゴマーク)+シフト+4を押し、さらにスペースキーを押し、任意のウィンドウをクリックすると、そのウィンドウのスクリーンショットがとれます
    • 以上の操作で、デスクトップにピクチャファイルができます。これをWordかText Editにドラッグアンドドロップします。
    • もしくは、デスクトップのピクチャファイルをダブルクリックで開き、欲しい部分を矩形ツールで選択してコピーし、WordかText Editにペーストします
  • Control キーを押しながらキーボードショートカットを押すと、画像はファイルではなく、クリップボードに保存されるので、直後に書類にペーストできます。
  • がんばったところ、大変だったところなどを書いていただいても結構です。また、できれば自力でやって欲しいのですが、だれかに教えてもらったり、web上のサンプルプログラムを参考にした場合は、そのことを説明書に書いてください。また、クラスメートににプログラムを教えた場合も、だれのどこを手伝ったかを書いておいてください。

出来上がったプログラムの提出方法

  • フォルダを作ってその中に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ですかという意味のダイアログが出るかと思いますが問題ありません。
  • レポート提出用フォルダは書き込み専用で見ることができません。アップロードできたかどうか不安でしたら教員まで質問してください。
  • 同じ名前のフォルダを投げ込むと、エラーになります。ということで新しいバージョンができたら別の名前のフォルダを作って提出し直してください。(フォルダ名最後に数字をつけてください)

締切

  • 締め切りは2019年2月4日11:59am(正午)とします
    • この日までに提出してください

以前の優秀作品例


講義予定

  • 10月4日ガイダンス
  • 10月11日
  • 10月18日休講
  • 10月25日
  • 11月1日休講
  • 11月8日
  • 11月15日
  • 11月22日
  • 11月29日
  • 12月6日
  • 12月13日
  • 12月20日
  • 12月27日
  • 1月10日(実質最後の授業)
  • 1月17日(自習。演習室は公開します。TAが待機します。出欠はとりません。)
  • 1月24日 (補講・試験期間のため授業なし。必要ならば演習室を使って最終課題を進めてください。TAは待機しません。)

javaのマニュアル

http://docs.oracle.com/javase/jp/8/docs/api/index.html

出来上がったプログラムの提出方法

  • フォルダを作ってその中に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://gyazo.com/de3288074dae1c75f6df4ef3c0b9b3d4.png

http://www.amazon.co.jp/dp/4883732258/

買ってください。もしくは、先輩から安く譲ってもらってください。

この講義の目的

  1. Javaでプログラムする
  2. オブジェクト指向の概念を理解してプログラミングする
  3. GUIプログラミングをする

この講義の順序

  1. Javaになれる(C言語などのプログラミング手法の復習)
  2. オブジェクト指向について理解する
  3. GUIプログラミングについて理解する(イベント駆動)
  4. お絵描きプログラムを作ってみる

成績評価

  1. お絵描きプログラムの完成度,作り込み
  2. 毎回の宿題の達成(参考程度)
  3. 出席状況(参考程度)

今学期の授業(終了分)

第1章および第2章

terminalを起動する

http://siio.jp/gyazo/7366bfab668207c6598c4d88ef70d2d4.png

  • terminalは、/Applications/Utilities/の中にあります。 ちなみに、/Applicationsはファインダでは/アプリケーションと日本語として見えます。 /Applications/Utilities/は、/アプリケーション/ユーティリティ/と日本語として見えています。
  • ダブルクリックすると起動します。 よく使うことになると思いますので、dockにドラッグアンドドロップして 登録しておくと良いかと思います。
  • ターミナルから、javacとタイプしてみてください。Javaがすでに入っているので、 オプションの説明が日本語で出てくると思います。

おすすめテキストエディタCotEditor?

https://coteditor.com/img/appicon/128@2x.png

  • Javaのプログラムを作るテキストエディタです。一番簡単にはterminalからviとかemacsとかpicoとかタイプして エディタを呼び出せば良いです。
  • でも日本語の設定などが結構難しいので、GUIベースのエディタを使ってみましょう。
  • いくつかありますが、おすすめの一つはCotEditor?という、便利なフリーウェアのテキストエディタです。
  • これも便利なのでdockに入れておくとよいと思います。

こちらからダウンロードできます。 演習室のOSにあわせたバージョンをダウンロードして~/Applicationsにコピーします。

https://coteditor.com/archives.ja

超簡単なプログラム(hello world)を作ってみる

  • ターミナルから、vi Hello.javaとかemacs Hello.javaとかpico Hello.javaとかタイプしたり、 もしくは、cotEditerを起動して作成します。
  • ここで、以下のようなプログラムを書いてみます。
class Hello {  
public static void main (String args[]) {
        System.out.println("hello java world!");
        }
}

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.setVisible(true);
       }

}

これをSimpleWindow.javaという名前で保存して、

javac SimpleWindow.java
java SimpleWindow

とタイプしてコンパイル/実行します。 このプログラムは,ウィンドウのクローズボタンを押しても終了しません. プログラムを停止するには,ターミナルでコントロール-cを押します.

simplewindow.png

第3章

  • 演習1
  • 演習3.4をみて、自分の名前の最初の文字の文字コードを表示してみてください。
  • 演習2
  • コマンドの引数はarg[0], arg[1] ... などにString型の配列としてプログラムに引き渡されます。
  • 二つの引数を与えたときに、それが+でつないで表示されるプログラムを作りましょう。

http://gyazo.com/8159f78165e17781a7110de3763c833c.png

ヒント

  • 以下は引数一つを表示するだけのサンプルです。これをもとに考えてください。
  • arg[0]とarg[1]をprintlnの中で+でつないで表示すれば良いです。
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章

  • 演習4.2をやってみよう

第5章

演習

  • 演習問題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の基準に従ってABCDを表示するプログラムを書け。 動作例を以下に示す。

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");
		}
	}
}
  • 演習問題5.5をやってみよう

http://gyazo.com/1733defca0c709c41c69ea729320ab61.png

解答例:

class Kinri {
public static void main (String args[]) {
	double okane=100000;
	int year;
	year=1;
	while(okane < 200000) {
		okane = okane * 1.05;
		System.out.println("year = " + year + "  okane= " + okane);
	 	year++;
	}
}
}

現在の普通預金の金利0.001%だと倍になるのに何年かかるだろうか。確かめてみよう。

  • 演習5.6をやってみよう

while文をfor文に変えてみる

解答例:

class Kinri {
public static void main (String args[]) {
	double okane=100000;
	int year;
	for(year=1;okane < 200000; year++) {
		okane = okane * 1.05;
		System.out.println("year = " + year + "  okane= " + okane);
	}
}
}

for-each文は新しい手法なので練習しましょう

  • プログラム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);
	     }
       }
}

演習

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);
       }
}
  • 今日の課題提出

ArgsTest2.javaとArgsTest2.classを出席番号+ローマ字名前のフォルダに入れて、圧縮して提出してください。

第6章 クラスの基礎

クラスとインスタンスの説明をしました

  • クラスは型、インスタンスはそれから作られたもの
    • クラスがたいやきの焼き型だとすると、インスタンスはそれから作られたたいやき
    • クラスは設計図でインスタンスはそれから作られたもの
  • クラスとインスタンスそれぞれにメソッドと変数がある
    • クラス変数 例:何個のインスタンスを作ったか?
    • クラスメソッド 例:インスタンスを作れ
    • インスタンス変数 例:ひとつのたいやきの重さ
    • インスタンスメソッド 例:たいやきをxxグラム食べる

http://gyazo.com/bbdd3587977a172f7fa7f00c4f5787e0.png

  • 演習

今作ったTestPoint3D.javaを変更して

  • 二つのインスタンスpt1, pt2を作り、
  • それぞれのインスタンス変数x, y, zを10,20,30と-10,-20,-30にして、
  • それぞれのインスタンスメソッドpinrt()を呼ぶ

ようにしてください。 この結果、以下のような実行結果が出るようにしてください

http://gyazo.com/deeb78a70a724a01ce76945235d42ab8.png

クラス変数・メソッドとインスタンス変数・メソッド

  • staticとついているのがクラス変数、クラスメソッド
  • staticが付いていないのがインスタンス変数、インスタンスメソッドです

public static void main の説明をしました

  • javaコマンドは、引数のクラスのクラスメソッドmainを実行します
    • staticと付いているのがクラス変数、クラスメソッドの印です
  • Pointクラスにクラスメソッドmainを実装すれば自分自身をテストできます
  • クラスPoint3Dに自分自身をテストするクラスメソッドmainを作ってみよう

http://gyazo.com/bdef2ab8e69f7f6e62273c2d67d7af2e.png

変数にはメソッド経由でアクセスするのが良いという説明をしました

  • 変数の型などを将来変更してもメソッドの書き換えで対応できます
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();

       }
  • 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());
	}
  • 今日の課題提出

Point3D.javaとPoint3D.classを出席番号+ローマ字名前のフォルダに入れて、圧縮して提出してください。

2018年10月25日宿題: Osaifuクラスを作ってみよう

次回は休講ですので再来週11/8の授業の最初に回収します。

  • Osaifuクラスからはインスタンスがたくさん作られる
    • Osaifuクラスはお財布の設計図/工場、ここから実際のお財布(インスタンス)が複数作られる
    • 工場出荷時の残金は0円だけど、その後、いろいろな値になるだろう(お金持ちのお財布には残金が多いだろうし、逆ならば少ないだろう)
    • ということで残金はインスタンス変数とすべきだろう
  • Osaifuクラスには次のメソッド、変数が必要だろう
    • 残金を表すインスタンス変数 int okane
    • お金を入金するインスタンスメソッド void in(int x);
    • お金を出金するインスタンスメソッド int out(int x); 戻り値は実際に出金できた金額(残金が不足ならばあるだけしか出せない)
    • 残金を印刷するインスタンスメソッドがあってもよいだろう void print();
      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クラスにコンストラクタを追加してみよう

  • Osaifu() で残金0のインスタンスを作る
  • Osaifu(int x) で引数を残金の初期値としたインスタンスを作る

ことができるコンストラクタを作ろう。

これをmainから呼んで、上記のプログラムと同じことをするためには、

		Osaifu saifu1 = new Osaifu(1000);//インスタンスを作る
		//最初の保持金額を1000円にする
		Osaifu saifu2 = new Osaifu(500);//インスタンスを作る
		//最初の保持金額を500円にする

とすることになる。

コンストラクタ解答編

以下のコンストラクタを作ることになる。

	Osaifu() { okane = 0; }
	Osaifu(int x) { okane = x; }

これは以下のように書いても良い。

	Osaifu() { this(0); }
	Osaifu(int x) { okane = x; }

第8章 継承

継承の話をしました。 別のクラスを継承することで、 差分だけを書いて機能を拡張していくことができます。

http://gyazo.com/2c8ef14d8be63b9fc18c58d79f2f3879.png

Osaifuクラスを継承してOsaifuUSDクラスを作ってみよう

  • OsaifuUSDクラスはアメリカで買い物をするときに便利な、アメリカドルでお金を出し入れできる財布です。
  • あたらしく追加するメソッドは以下です
    • void inUSD(int x) xドルをお財布に入金します。このとき円に換算して残高に追加します
    • int outUSD(int x) xドルをお財布から出金します。このとき円に換算した金額だけ残高が減ります。戻り値はドルにしましょう。
    • 1ドルは90円にしてください
  • 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 * 90;
		return usd;
	}

	public void inUSD(int usd) {
		okane+=usd * 90;
	}
	
	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)

親のメソッドを活用しても良い

public class OsaifuUSD extends Osaifu {

	public int outUSD(int usd) {
		return ( out( use * 90) / 90 );
	}

	public void inUSD(int usd) {
		in( usd * 90 );
	}
	
…

}

親のメソッドを呼ぶことを明示的に書くためにsuper.をつかってもよい。

public class OsaifuUSD extends Osaifu {

	public int outUSD(int usd) {
		return ( super.out( use * 90) / 90 );
	}

	public void inUSD(int usd) {
		super.in( usd * 90 );
	}
	
…

}

小テスト練習

以下のプログラムの中で、 クラス、インスタンス、サブクラス、スーパクラス、クラスメソッド、インスタンスメソッドがどれであり、 インスタンス化、継承がどこで行われているのか確認してください。 (importで始まる一行目はまだ説明していない内容なので小テストでは扱いません。無視してください)

import javax.swing.JFrame;

 public class SampleWindow extends JFrame {
	public static void main(String args[]) {
		SampleWindow w = new SampleWindow();
 		w.setVisible(true);
	}
 }

第9章 エラーと例外処理

次のプログラムを作って試してください。 引数が少ないとエラーが出るのを確認してください。

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.");
		}
	}
}

第10章 Stringクラスとコレクションフレームワーク

最初の引数(文字列)を表示するプログラムを作る。クラス名はTestString?

public class TestString {
	public static void main(String argv[]) {
		System.out.println(argv[0]);
	}
}

演習10.1改:最初の引数(文字列)を逆に出力するプログラムを作る

[e100:?/Documents/java] siio% java TestString ochanomizu
ochanomizu
uzimonahco
[e100:?/Documents/java] siio% 

さらには、引数がない場合は引数入力を促すことを表示してみよう。

[e100:?/Documents/java] siio% java TestString
please input a word
[e100:?/Documents/java] siio%

このソースは、

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");
		}
	}
}

である。

Linked List の練習

サンプルプログラムを実行するときは、

	LinkedList<String> list = new LinkedList<String>(); 

などと定義すると良い。

program 10.2 改造

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);

        }

}

Hash Mapの練習

プログラム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>();
	
	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");
	}

	}
}
  • 今日の課題提出

EtoJ.javaとEtoJ.classを出席番号+ローマ字名前のフォルダに入れて、圧縮して提出してください。

第11章 入出力

一番簡単なファイル書き出し

import java.io.*;

public class FoutTest {
	public static void main(String[] args) {
		try {
			FileOutputStream fout = new FileOutputStream("fout.dat");
			fout.write(1234);
			fout.close();
		}
		catch (IOException e) {
			System.out.println(e);
		}
	}
}

これでfout.datという名前のファイルができあがるはずです。 作ったファイルを

od -h fout.dat

または

hexdump fout.dat

してみてください

整数を出力する例

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

整数を入出力する例

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 をやってください

作ったファイルを

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をやってみてください

作ったファイルを

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);
		}
	}
}

文字ストリームをファイルに書いて読み込むプログラム

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をやってください

キーボードから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);
  			}
    }
 }
  • 今日の課題提出

「キーボードから1行入力された文字列によるテキストファイルを作る」プログラムの.javaと.classファイルを、出席番号+ローマ字名前のフォルダに入れて、圧縮して提出してください。

  • 解答例
import java.io.*;

public class En112 {
	public static void main(String[] args) {
	
		try {
			InputStreamReader ireader = new InputStreamReader (System.in);
			BufferedReader breaderK = new BufferedReader(ireader);
			String line = breaderK.readLine();
			
			FileWriter fwriter = new FileWriter("writer.txt");
			PrintWriter pwriter = new PrintWriter(fwriter);
			pwriter.println(line);
			pwriter.close();
			
			FileReader freader = new FileReader("writer.txt");
			BufferedReader breaderF = new BufferedReader(freader);
			
			String tmp=null;		
			while(  (tmp=breaderF.readLine())  != null)
				System.out.println(tmp);
			
			breaderF.close();
		
			}
			catch(IOException e) {
				System.out.println(e);
			}
	}
}

http://www.ocha.ac.jp/の内容を表示するプログラムを書いてみよう

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...");
		}
	}
}

写真ファイルのダウンロード

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...");
		}
	}
}

写真読み込みの高速化

上記の例では写真データを1バイトずつ読み書きしていました。 InputStream?のメソッドを調べると、複数バイト単位で読み込むメソッドがあります。 たとえば、1024バイトずつ読み書きすることで、処理速度が向上すると期待できます。 そこで、複数バイト読み書きするよう、上記のプログラムを変更して、 実際にどの程度(実行速度にして何倍くらい)性能向上するか確認してみましょう。

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[1024];

という配列を用意して、

	int datalength;
	while(( datalength=istream.read(data)) != -1) fout.write(data, 0, datalength);

とします。

  • 解答例
import java.io.*;
import java.net.*;

//http://siio.jp/cat.jpg
//をダウンロードして、cat.jpgというファイルを作るプログラムを作ってください。
//データはテキストじゃなくて、バイナリーです。

public class URLJpeg2 {
	public static void main (String argv[]) {
		byte[] data = new byte[1024];
		try {
			URL targetURL = new URL("http://siio.jp/cat.jpg");
			InputStream istream = targetURL.openStream();
			
			FileOutputStream fout = new FileOutputStream("cat.jpg");
			
			int datalength;
			while(( datalength=istream.read(data)) != -1) fout.write(data, 0, datalength);
			
			istream.close();
			fout.close();
			
			
		} catch (IOException e) {
			System.out.println("error...");
		}
	}
}

ここでは1024バイトを読み込むことにしました。でも、InputStream?のメソッドを見ると、available()というのがあります。

available()
この入力ストリームのメソッドの次の呼出しによって、ブロックせずにこの入力ストリームから読み込むことができる(またはスキップできる)推定バイト数を返します。

これを使えば、適切な長さを見積もれるかもしれません。

第12章 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);
       }
}

JFrameを継承するプログラミング

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();
	}
}

ラベルを表示するウィンドウ

プログラム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();
	}

}

ボタンを1個貼り付ける

JLabelのところをJButtonにしてみましょう

本日の課題

ボタンを出すプログラムのjavaとclassを提出してください。

ボタンを1個貼り付ける

JLabelのところをJButtonにしてみましょう

解答例:

import javax.swing.*;
import java.awt.*;

public class SimpleWindow extends JFrame {

	public void initialize () {
		this.setTitle("私が作った最初の窓");
		
		JButton button = new JButton("Hello!");
		Container container = this.getContentPane();
		container.add(button);
		this.pack();
		
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	public static void main(String argv[]) {
		SimpleWindow sw = new SimpleWindow();
		sw.initialize();
	}

}

http://www.siio.jp/index.php?plugin=attach&pcmd=open&file=button.png&refer=How2JavaProgramming

ボタンを2個表示するウィンドウ

プログラム12.2をみてください。 getContentPane?()で得られたContainerに直接ボタンを貼付けることもできますが、 貼付けられるのは一つのボタンだけのようです。 そこで、JPanel (パネル) に2個のボタンを貼付け、それをContainerに貼付けることで複数のボタンを表示しています。

http://gyazo.com/03c28df2419065241b8736b7b69d7fd3.png

プログラム12.2を参考にして、継承を使ったプログラムによるウィンドウの中に、 2個のボタンを出してみよう。

http://gyazo.com/4c3086ae9b6b5434d2ea741369f731c5.png

解答例:

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();
	}

}

このプログラムでは,ボタンを押しても何もおこりません.

ボタンが押されたイベントを受け取るためには,

  1. ActionListener?をimplementしたクラスを作る
  2. そのインスタンスを作る
  3. これをボタンに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();
	}

}

ここではボタンを区別するために、インスタンス(への参照)を比較した。それ以外の方法もある。 一つは、ボタンのテキストを入手することである。ボタンのテキストを入手してそれを比較しても良い。 ボタンのテキストを表示するだけなら以下のようにしても良い。

        public void actionPerformed(ActionEvent e){
                System.out.println(((JButton)e.getSource()).getText());
        }

もう一つは、ボタンにコマンドを書く方法である。 ボタンにsetActionCommand?(String)を定義しておくと、getActionCommand?()で知ることができる。

button1.setActionCommand("hello");

としておけば、actionPerformedの中で

e.getActionCommand();

で文字列を得られる。例えば、

        public void actionPerformed(ActionEvent e){
                System.out.println(e.getActionCommand());
        }

でコマンド部分を印刷できる。

プログラム12.4をやってください。

演習12.2(改)

上で作った二つのボタンのプログラムに対して、レイアウトマネージャのFlowLayout?を使って、左寄せ、センタリング、右寄せを試してください。

演習のヒント

		bt1 = new JButton("button1");
		bt2 = new JButton("button2");
		panel.setLayout(new FlowLayout(FlowLayout.RIGHT));
		bt1.setActionCommand("this is b1");
		bt2.setActionCommand("this is b2");

FlowLayout?にはCENTER, LEFT, RIGHTなどの揃え方の指定がありますが、これをコンストラクタの引数で指定できるようです。addのところではレイアウト指定しないようです。

第13章 様々なコンポーネントとレイアウト

プログラム13.1の説明図

http://gyazo.com/649bbe400f96c8c31923bcf7e5aebbd4.png

提出

本日作ったボタンを二つ表示するプログラム(どのバージョンでも良いです)のjava, classを、いつものように学籍番号+ローマ字名前のフォルダに入れて、圧縮して提出してください。

[以下を、宿題としていましたがみなさん苦労されているので撤回します。演習にします。次回の授業の最初に皆さんでやっていただきます。]

第13章 様々なコンポーネントとレイアウト(続き)

演習:プログラム13.1のようにボタンを配置して、それぞれを押すと、それぞれのボタンの名前が表示されるプログラムを作ってください。

ヒント:プログラム12.4を見て、上記のプログラムを拡張して5個のボタンに対応して, WEST, EAST, SOUTH, NORTH, CENTERと表示されるプログラム作るとわかりやすいかもしれません。そうすれば、プログラム13.1のボタンの名前を表示するプログラムが作りやすいと思います。次回の授業でつづきをやります。

なお、以下のようにすると、ボタンの名前を印刷することができます。

        public void actionPerformed(ActionEvent e){
                System.out.println(((JButton)e.getSource()).getText());
        }

プログラム12.4は継承を使っていないので以下のように書き直します。

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class ComplicatedLayoutSample extends JFrame implements ActionListener {
	
	public void initialize() {
		JPanel panel1 = new JPanel();
		JPanel panel2= new JPanel();
		JPanel panel3= new JPanel();
		JPanel panel4= new JPanel();
		JPanel panel5= new JPanel();
		
		panel1.setLayout(new FlowLayout());
		for (int i=1; i<=3; i++) {
			panel1.add(new JButton("NORTH" + i));
		}
		panel2.setLayout(new BoxLayout(panel2, BoxLayout.Y_AXIS));
		for (int i=1; i<=3; i++) {
			panel2.add(new JButton("WEST" + i));
		}		
		panel3.setLayout(new GridLayout(3,2));
		for (int i=1; i<=6; i++) {
			panel3.add(new JButton("CENTER" + i));
		}	
		panel4.setLayout(new BorderLayout());
		panel4.add(new JButton("EAST1"), BorderLayout.NORTH);
		panel4.add(new JButton("EAST2"), BorderLayout.SOUTH);		
		panel5.setLayout(new BoxLayout(panel5, BoxLayout.X_AXIS));
		for (int i=1; i<=4; i++) {
			panel5.add(new JButton("SOUTN" + i));
		}	
		
				
		Container container = this.getContentPane();
		container.add(panel1,BorderLayout.NORTH);
		container.add(panel2,BorderLayout.WEST);
		container.add(panel3,BorderLayout.CENTER);
		container.add(panel4,BorderLayout.EAST);
		container.add(panel5,BorderLayout.SOUTH);

		this.setSize(400,200);
		this.setVisible(true);
	}
	
	public void actionPerformed(ActionEvent e) {
	}
	
	public static void main(String[] args) {
		ComplicatedLayoutSample cls = new ComplicatedLayoutSample();
		cls.initialize();	
	}
}

つぎにaction listenerとして自分自身を追加します。

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class ComplicatedLayoutSample extends JFrame implements ActionListener {
	
	public void initialize() {
		JPanel panel1 = new JPanel();
		JPanel panel2= new JPanel();
		JPanel panel3= new JPanel();
		JPanel panel4= new JPanel();
		JPanel panel5= new JPanel();
		
		panel1.setLayout(new FlowLayout());
		for (int i=1; i<=3; i++) {
			JButton btn = new JButton("NORTH" + i);
			btn.addActionListener(this);
			panel1.add(btn);
		}
		panel2.setLayout(new BoxLayout(panel2, BoxLayout.Y_AXIS));
		for (int i=1; i<=3; i++) {
			JButton btn = new JButton("WEST" + i);
			btn.addActionListener(this);
			panel2.add(btn);
		}		
		panel3.setLayout(new GridLayout(3,2));
		for (int i=1; i<=6; i++) {
			JButton btn = new JButton("CENTER" + i);
			btn.addActionListener(this);
			panel3.add(btn);
		}	
		panel4.setLayout(new BorderLayout());
		JButton btn1 = new JButton("EAST1");
		btn1.addActionListener(this);
		panel4.add(btn1, BorderLayout.NORTH);
		JButton btn2 = new JButton("EAST2");
		btn2.addActionListener(this);
		panel4.add(btn2, BorderLayout.SOUTH);

		panel5.setLayout(new BoxLayout(panel5, BoxLayout.X_AXIS));
		for (int i=1; i<=4; i++) {		
			JButton btn = new JButton("SOUTN" + i);
			btn.addActionListener(this);
			panel5.add(btn);
			}	
		
				
		Container container = this.getContentPane();
		container.add(panel1,BorderLayout.NORTH);
		container.add(panel2,BorderLayout.WEST);
		container.add(panel3,BorderLayout.CENTER);
		container.add(panel4,BorderLayout.EAST);
		container.add(panel5,BorderLayout.SOUTH);

		this.setSize(400,200);
		this.setVisible(true);
	}
	
	public void actionPerformed(ActionEvent e) {
		System.out.println( ((JButton)e.getSource()).getText()   );
	}
	
	public static void main(String[] args) {
		ComplicatedLayoutSample cls = new ComplicatedLayoutSample();
		cls.initialize();	
	}
}

どのボタンからのイベントであるかを識別する方法

  • プログラム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.2節を読んで,プログラム13.2を実行させてください

ボタンが一つしかないプログラムなので、ActionPerformed?の中で、 ボタン種類のチェックを省略してしまっているところが特徴です。

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class JTextFieldSample extends JFrame implements ActionListener {
JButton button;
JTextField textleft, textright;

public void initialize() {
	button = new JButton("left to right");
	button.addActionListener(this);
	textleft= new JTextField(10);
	textright= new JTextField(10);
	JPanel panel = new JPanel();
	
	panel.setLayout(new BorderLayout());
	panel.add(textleft, BorderLayout.WEST);
	panel.add(textright, BorderLayout.EAST);
	panel.add(button, BorderLayout.SOUTH);
	
	this.getContentPane().add(panel);
	
	this.setTitle("JTextFieldSample");
	this.pack();
	this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	this.setVisible(true);
}

public void actionPerformed(ActionEvent e){
	textright.setText(textleft.getText());
	textleft.setText("");
}

public static void main(String[] args){
	JTextFieldSample sample = new JTextFieldSample();
	sample.initialize();
}

}

演習13.1をやってください

このプログラムに、右のテキストフィールドをクリアするclearボタンを追加してください。 こんなのをつくってください。

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);
	}
}

解答例(初期化メソッドで作る)

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class JTextFieldSample extends JFrame implements ActionListener {
 JButton button, clearButton;
JTextField textleft, textright;

public void initialize() {
	button = new JButton("left to right");
	button.addActionListener(this);
	clearButton = new JButton("clear");
	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);
	
	this.getContentPane().add(panel);
	
	this.setTitle("JTextFieldSample");
	this.pack();
	this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	this.setVisible(true);
}

public void actionPerformed(ActionEvent e){
	if( e.getSource() == button) {
		textright.setText(textleft.getText());
		textleft.setText("");
	}else{
		textright.setText("");
	}
}

public static void main(String[] args){
	JTextFieldSample sample = new JTextFieldSample();
	sample.initialize();
}

}

どのボタンからのイベントであるかを識別する方法

action Performed (Action Event e) の中で、

  • e.get Source()してButtonのインスタンスを得て比較する
  • e.get Action Command()でアクションを得て文字比較する
    • あらかじめbutton.set Action(”アクション名")しておく
  • ボタンからget Textしてボタンの文字列を得て文字比較する
    • get Sourceで得られるのはボタンの親クラスなのでButtonにキャストする
System.out.println((JButton)(e.getSource()).getText());

13.4節を読んで、プログラム13.4を実行してください

JListの型を指定しないとコンパイラの警告が出ます。警告を出さないためには、以下のように宣言すると良いようです。

	JList<String> list = new JList<String>(data);

提出

プログラム13.4のjava, classを、いつものように学籍番号+ローマ字名前のフォルダに入れて、圧縮して提出してください。

13.5節を読んで,プログラム13.5を実行してください

http://gyazo.com/dd4e103c011682b3a78b9ed0c8d5134b.png

http://gyazo.com/4755cce7280963b32050db455d265cc1.png

メニューアイテムにcommandという情報をつけて、ActionPerformed?ではこれを使ってメニュー項目を区別しています。

演習13.2をやってください(メニュー項目は何でも良いです)

演習ができそうにないという人は、飛ばして、次に進んでください。

http://gyazo.com/2d9c3b6534e7b87fcd3ec22be00d5fed.png

新しいメニューも追加してみてください。例えば、payment、cash, credit card, prepaid cardなど追加してみましょう。

13.6節を読んで,プログラム13.6を実行してください

教科書203ページのプログラム13.6の5行めのところに、

... implements ActionListener6: {

とありますが、これは、

... implements ActionListener {

の間違いのようです。

2018年12月20日

終章 おまけ

マウスイベント

マウスイベントを受け取るには、Mouse ListenerやMouse Motion Listenerなどをインプリメントします。 以下のようにするとイベントをうけとれるます。

まずはMouse Motion Listenerを試してみましょう。 マニュアル

によると、実装しないといけないメソッドはmouse Draggedとmouse Movedです。

  • void mouseDragged(MouseEvent? e) コンポーネント上でマウス・ボタンを押してドラッグすると呼び出されます。
  • void mouseMoved(MouseEvent? e) ボタンを押さずにマウス・カーソルをコンポーネント上に移動すると呼び出されます。
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class MouseTest extends JFrame implements MouseMotionListener{
	
	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.addMouseMotionListener(test);
		test.setSize(400,300);
		test.setVisible(true);
		test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
}

次に、Mouse Listenerも実装してみましょう。マニュアル

によると、

  • void mouseClicked(MouseEvent? e) コンポーネント上でマウスボタンをクリック (押してから離す) したときに呼び出されます。
  • void mouseEntered(MouseEvent? e) コンポーネントにマウスが入ると呼び出されます。
  • void mouseExited(MouseEvent? e) コンポーネントからマウスが出ると呼び出されます。
  • void mousePressed(MouseEvent? e) コンポーネント上でマウスボタンが押されると呼び出されます。
  • void mouseReleased(MouseEvent? e) コンポーネント上でマウスボタンが離されると呼び出されます。

これを追加します。宣言で

public class MouseTest extends JFrame implements MouseListener, MouseMotionListener{

として、またmainに

		test.addMouseListener(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);
	}
	
}

線を引く簡単なプログラム

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を使ってみよう

http://gyazo.com/4383db7fb81f9eacbf5cc959ff77a33d.png

  • Eclipseの警告を消す方法
	private static final long serialVersionUID = 42L;

という変数を定義しておきます。


欠席状況

3/4以上出席してください。(欠席は3回まで)欠席4回で自動的に不可になります。 欠席3回以下なら不可にはなりませんが、成績が下がるかもしれませんので、心当たり無ければ連絡ください。 (病欠、公欠、忌引などは0になっているはずですが間違っていたら連絡ください。)

学籍番号10/410/1110/2511/811/1511/2211/2912/612/1312/201/10合計
1720501000000000000
1720502000000000000
1720503000000000000
1720504000000000000
1720505000000000000
1720506000000000000
1720507000000000000
1720508010000000001
1720509000000000000
1720510000000000000
1720511001001010003
1720512000000000000
1720513000000000000
1720514000000000101
1720515000000000000
1720516000000000000
1720517000000000000
1720518000000000000
1720519000001000001
1720520000000000000
1720521100001000103
1720522000000000000
1720523000000000000
1720524000000000000
1720525000000000000
1720526000000000101
1720527000010000001
1720528000001000012
1720529000000000011
1720530100001001104
1720531000001000001
1720532000000000000
1720533000000000000
1720534000001000001
1720535000000000000
1720536000001001002
1720537000000000000
1720538000000000000
1720539000000000011
1720540000001000001
1720541000000000000
1720542000000000000
1720543000000000000
16205141111111111111
1520520010010001003
1740665000000000000

集中演習「ヒューマンインタフェース」出題範囲 (2019年1月実施予定)

教科書の3.5節を読んで、 ユーザモデルとデザインモデル(設計者のモデル)について理解しておいてください(36ページから40ページ)。 この部分を授業で説明した資料を以下に置いておきます。

皆さんは、自分が作ったプログラムを人に使ってもらった時に、 思いもしないようなバグを発見してもらった経験がありますでしょうか? 他人は、 プログラムを作った自分だったら絶対に行わないような操作をやってしまいます。 そこで、

  • 製品になって人々が使うようになってから発覚するプログラムのバグ、
  • 多くの人々が使う機械の誤操作や故障を引き起こしてしまう設計ミス を設計者、開発者が排除できない原因について考えておいてください。

大学院HCI演習および人間機械系演習 2018年度後期

講義予定

10月30日の福地先生講義は延期になり、通常授業になります。

  • 10月9日ガイダンス
  • 10月16日休講
  • 10月23日
  • 10月30日
  • 11月6日
  • 11月13日
  • 11月20日明治大学福地先生
  • 11月27日
  • 12月4日
  • 12月11日
  • 12月18日
  • 12月25日
  • 1月8日
  • 1月15日
  • 1月22日

発表の記録

学籍番号
1840702
1840706
1840708
1840709
1840710

1840644 (聴講)
1840645 2018年11月6日
1840648
1840649 2018年11月6日
1840651
1840655
1840658
1840659
1840661
1840662
1840663
1840665
1840669
1840673 2018年11月6日
1840675
1840677
1740671

このページについてのお問い合わせはsiio@is.ocha.ac.jpまで。


添付ファイル: filemenuspeed.png 1382件 [詳細] filebuttontest.c 1989件 [詳細] filemenu2.png 2904件 [詳細] filemenu1.png 2866件 [詳細] fileSimpleAnime.class 3088件 [詳細] fileJTextFieldSample.class 2842件 [詳細] filePanelButtons.class 2758件 [詳細] fileSimpleDraw.java 2566件 [詳細] fileDrawPanel.java 2567件 [詳細] fileTerminalHerePlugin.dmg 3469件 [詳細] filemi2.1.6J.dmg 3808件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-04-11 (木) 10:53:03 (132d)