集中演習「ヒューマンインタフェース」出題範囲 (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

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

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

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

2018年12月13日

第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を、いつものように学籍番号+ローマ字名前のフォルダに入れて、圧縮して提出してください。


講義予定

  • 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日
  • 1月24日

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を、いつものように学籍番号+ローマ字名前のフォルダに入れて、圧縮して提出してください。

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


欠席状況

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

学籍番号10/410/1110/2511/811/1511/22合計
17205010000000
17205020000000
17205030000000
17205040000000
17205050000000
17205060000000
17205070000000
17205080100001
17205090000000
17205100000000
17205110010012
17205120000000
17205130000000
17205140000000
17205150000000
17205160000000
17205170000000
17205180000000
17205190000011
17205200000000
17205211000012
17205220000000
17205230000000
17205240000000
17205250000000
17205260000000
17205270000101
17205280000011
17205290000000
17205301000113
17205310000011
17205320000000
17205330000000
17205340000011
17205350000000
17205360000011
17205370000000
17205380000000
17205390000000
17205400000011
17205410000000
17205420000000
17205430000000
16205141111116
15205200100102
17406650000000

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


添付ファイル: filemenuspeed.png 1292件 [詳細] filebuttontest.c 1895件 [詳細] filemenu2.png 2818件 [詳細] filemenu1.png 2778件 [詳細] fileSimpleAnime.class 2997件 [詳細] fileJTextFieldSample.class 2757件 [詳細] filePanelButtons.class 2675件 [詳細] fileSimpleDraw.java 2481件 [詳細] fileDrawPanel.java 2476件 [詳細] fileTerminalHerePlugin.dmg 3380件 [詳細] filemi2.1.6J.dmg 3721件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-12-13 (木) 16:32:29 (5d)