プログラミング実習(java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf ·...

108
大学 プログラミング (Java) 2008 第1学 センター) 1 2008.8.1415 1 大学 大学 E–mail : [email protected]

Upload: others

Post on 23-Aug-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

放送大学集中面接授業

プログラミング実習(Java)

2008年度第1学期

(神奈川学習センター)

講師:坂口 利裕1

実施日 2008.8.14~15

1公立大学法人 横浜市立大学 国際総合科学研究院 E–mail : [email protected]

Page 2: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し
Page 3: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

3

目 次

第 I部 本文 11

第 1章 Javaによるオブジェクト指向プログラミング 151.1 構造化プログラミングとオブジェクト指向言語 . . . . . . . . . . . . . . . . 15

1.1.1 構造化プログラミング . . . . . . . . . . . . . . . . . . . . . . . . . 151.1.2 オブジェクト指向 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

1.2 Javaプログラムの実例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191.2.1 パソコンの起動とWindowsの起動 . . . . . . . . . . . . . . . . . . 191.2.2 プログラム例の実行 . . . . . . . . . . . . . . . . . . . . . . . . . . 191.2.3 教材のセットアップ . . . . . . . . . . . . . . . . . . . . . . . . . . 20

第 2章 Javaによるプログラミングの実際とグラフィクス 232.1 プログラミングツールの使い方 . . . . . . . . . . . . . . . . . . . . . . . . 23

2.1.1 Sunの SDK - JDK . . . . . . . . . . . . . . . . . . . . . . . . . . . 232.1.2 プログラミングツールの使い方 . . . . . . . . . . . . . . . . . . . . 232.1.3 Javaプログラムの動作環境 . . . . . . . . . . . . . . . . . . . . . . 24

2.2 グラフィクスの基礎と Javaの描画メソッドの使い方 . . . . . . . . . . . . . 272.2.1 グラフィクスの基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . 272.2.2 Javaの描画メソッドの使い方とプログラムの改変 . . . . . . . . . . 282.2.3 練習 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

2.3 Javaの変数定義と演算・制御構造 . . . . . . . . . . . . . . . . . . . . . . . 302.3.1 変数と型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302.3.2 制御構造 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302.3.3 練習 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

第 3章 JavaによるGUIの制御 333.1 GUIの基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

3.1.1 GUI部品を構成するクラス . . . . . . . . . . . . . . . . . . . . . . 333.1.2 GUIオブジェクトとリスナー . . . . . . . . . . . . . . . . . . . . . 33

3.2 GUI部品を使ったプログラム例 . . . . . . . . . . . . . . . . . . . . . . . . 353.2.1 GUI部品使用の基本形 . . . . . . . . . . . . . . . . . . . . . . . . . 353.2.2 マウスのイベント処理の基本形 . . . . . . . . . . . . . . . . . . . . 35

Page 4: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

4

3.2.3 sample04.javaの実行と改変 . . . . . . . . . . . . . . . . . . . . . 373.3 マウスイベント処理プログラムの作成演習 . . . . . . . . . . . . . . . . . . 39

3.3.1 sample05.javaの実行と改変 . . . . . . . . . . . . . . . . . . . . . 393.3.2 終了の手順 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

第 4章 Javaによるアニメーション表現 414.1 アニメーション表現の基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

4.1.1 アニメーション表現の原理 . . . . . . . . . . . . . . . . . . . . . . . 414.2 Javaによるアニメーション表現の実際 . . . . . . . . . . . . . . . . . . . . 42

4.2.1 Java言語によるアニメーション表現 . . . . . . . . . . . . . . . . . 424.2.2 sample06.javaと sample07.javaの動作確認と観察 . . . . . . . . 43

4.3 アニメーションプログラムの完成 . . . . . . . . . . . . . . . . . . . . . . . 444.3.1 ダブルバッファ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444.3.2 sample07.javaの改変 . . . . . . . . . . . . . . . . . . . . . . . . . 44

第 5章 総合演習 475.1 データ入出力の基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

5.1.1 Javaにおけるデータファイルの扱い . . . . . . . . . . . . . . . . . 475.1.2 テキストファイルの読み込み手順 . . . . . . . . . . . . . . . . . . . 475.1.3 例外処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485.1.4 画像ファイルの利用 . . . . . . . . . . . . . . . . . . . . . . . . . . 48

5.2 Javaによるデータ処理と視覚化プログラム . . . . . . . . . . . . . . . . . . 505.2.1 sample08.javaの実行 . . . . . . . . . . . . . . . . . . . . . . . . . 50

5.3 総合演習とQ&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515.3.1 アプレットをアプリケーションとして動作させる手順 . . . . . . . . 51

第 II部 プログラム例と演習問題 55

第 6章 プログラム例 576.1 第1日で使用するプログラム . . . . . . . . . . . . . . . . . . . . . . . . . . 57

6.1.1 プログラム例(sample01.java) . . . . . . . . . . . . . . . . . . . 576.1.2 プログラム例(sample02.java) . . . . . . . . . . . . . . . . . . . 596.1.3 プログラム例(sample03.java) . . . . . . . . . . . . . . . . . . . 606.1.4 プログラム例(sample04.java) . . . . . . . . . . . . . . . . . . . 646.1.5 プログラム例(sample05.java) . . . . . . . . . . . . . . . . . . . 656.1.6 プログラム例(sample06.java) . . . . . . . . . . . . . . . . . . . 67

6.2 第2日で使用するプログラム . . . . . . . . . . . . . . . . . . . . . . . . . . 686.2.1 プログラム例(sample07.java) . . . . . . . . . . . . . . . . . . . 686.2.2 プログラム例(sample08.java) . . . . . . . . . . . . . . . . . . . 69

Page 5: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

5

第 7章 演習問題 717.1 補足のための演習問題 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

7.1.1 Javaのプログラム例の検索 . . . . . . . . . . . . . . . . . . . . . . 717.1.2 グラフィクスの応用 . . . . . . . . . . . . . . . . . . . . . . . . . . 71

第 III部 Javaの文法(要約) 73

第 8章 基本文法 758.1 Javaプログラムの構造 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

8.1.1 クラス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 758.1.2 インスタンス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 758.1.3 メソッド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

8.2 名前と型・数値 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768.2.1 名前 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768.2.2 予約語 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768.2.3 基本の型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76

8.3 演算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 778.3.1 算術演算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 778.3.2 関係演算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 778.3.3 論理演算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 778.3.4 その他の演算用記号 . . . . . . . . . . . . . . . . . . . . . . . . . . 78

8.4 変数とデータの型および代入演算 . . . . . . . . . . . . . . . . . . . . . . . 788.4.1 変数の表記方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 788.4.2 代入演算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 798.4.3 型変換 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 798.4.4 数値と文字列の変換 . . . . . . . . . . . . . . . . . . . . . . . . . . 80

8.5 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 808.5.1 単純文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 808.5.2 複合文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 808.5.3 条件文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 818.5.4 switch~case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 818.5.5 for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 828.5.6 while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 838.5.7 do ~ while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 838.5.8 breakと continue . . . . . . . . . . . . . . . . . . . . . . . . . . . 848.5.9 配列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 858.5.10 数学関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86

Page 6: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

6

第 9章 アプレットとグラフィクス 899.1 アプレットの基本形 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 899.2 グラフィクス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89

9.2.1 描画メソッド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 899.2.2 色の指定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91

第 10章 GUI 9310.1 GUI部品 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9310.2 レイアウト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99

10.2.1 BorderLayout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9910.2.2 GridLayout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99

付 録A 参考書の紹介 101A.1 Java学習のための参考書 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101A.2 発展的学習のための参考書 . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

Page 7: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

7

図 目 次

1 学習事項と全体の流れ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

1.1 コンピュータの基本構成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161.2 手続き重視型とイベント駆動型の比較 . . . . . . . . . . . . . . . . . . . . 171.3 LOGOにおけるタートルグラフィクス . . . . . . . . . . . . . . . . . . . . . 18

2.1 一般のコンパイラ型言語の実行環境と Javaの実行環境との違い . . . . . . 262.2 コンピュータグラフィクスにおける座標系のとり方と色の表現方法 . . . . 27

3.1 GUI部品とクラスの例(sample03.javaの実行画面) . . . . . . . . . . . 34

4.1 アニメーションの原理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414.2 Java言語によるアニメーション表示プログラムの骨格 . . . . . . . . . . . 42

7.1 正多角形描画メソッドの設計のためのヒント . . . . . . . . . . . . . . . . 72

8.1 ifによる条件文の動作の流れ . . . . . . . . . . . . . . . . . . . . . . . . . 828.2 switch~case構文のフローチャート表現 . . . . . . . . . . . . . . . . . . 838.3 for()構文のフローチャート表現 . . . . . . . . . . . . . . . . . . . . . . . 848.4 while構文のフローチャート表現 . . . . . . . . . . . . . . . . . . . . . . . 858.5 do ~ while構文のフローチャート表現 . . . . . . . . . . . . . . . . . . . 86

Page 8: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し
Page 9: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

9

表 目 次

2.1 プログラミングツールの使い方 . . . . . . . . . . . . . . . . . . . . . . . . 24

3.1 GUI部品のイベントの種類とその処理メソッド . . . . . . . . . . . . . . . 363.2 マウスのイベントの種類とその処理メソッド . . . . . . . . . . . . . . . . 37

8.1 Javaにおける基本の型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 778.2 算術演算用の記号 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 778.3 関係演算用の記号 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 788.4 論理演算用の記号 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 788.5 Javaにおける代入演算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 798.6 文字列の数値への変換方法 . . . . . . . . . . . . . . . . . . . . . . . . . . 808.7 数値の文字列への変換方法 . . . . . . . . . . . . . . . . . . . . . . . . . . 808.8 数学ライブラリの主なメソッド(クラス Math) . . . . . . . . . . . . . . . 87

9.1 定義済みの色(クラス Color) . . . . . . . . . . . . . . . . . . . . . . . . 92

Page 10: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し
Page 11: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

第I部

本文

Page 12: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し
Page 13: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

13

はじめに

この授業では,プログラミング経験者を対象に,グラフィクス処理・シミュレーションなどの応用プログラム開発の手順を体験学習していきます。2日間という短い時間で行ないますので,できるだけ目標を絞って,次のような事柄について学習していく予定です。

例題によるJavaプログラムの紹介と言語構造の理解

構造化プログラミングとオブジェクト指向言語の知識

Javaによるプログラミング環境と基本概念の理解

実習用パソコンにおけるプログラム開発の流れ

Javaを使いこなすための実習

より理解を深めるための実習

楽しむためのプログラミング知識

図 1: 学習事項と全体の流れ

授業は,全体での解説,コンピュータと体を使った実習,頭を使った練習,の繰返しで進めていきます。また,1時限の間にも1度か2度休憩をはさんでいきます。解説の場面では,じっくりと話を聞いてもらいますが,その他の場面では面接授業であることの利点を最大限に生かすよう,質問を積極的に行なってください。自分だけが分かっていないのでは,と思うことはありません。そのような場合,他の人も同様に分かっていないことの方が圧倒的に多いものです。なお,2003年度より始まった比較的新しい授業なので,予定通りに進むか,受講者の皆さんのニーズに合った内容になっているか,なお改善の余地を残したままの開講となってしまいました。そのような意味では,受講者の皆さんの要望に応じて臨機応変に内容を変更していくことも念頭においています。忌憚のないご意見を賜われば幸いです。

Page 14: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

14

Java既習者の方は

なお,受講者の中には,すでに Java言語の基本について十分理解のある方(中級者以上)もいらっしゃると思います。そのような方にとっては,少々物足りない授業内容となるのは否めません。そこで,中級者以上の方にも時間を有効に使っていただくために,演習問題を準備してあります。実習用パソコンの基本操作が理解できたら,授業の進行とは別に自由に取り組んでみて下さい(私より Javaに詳しかったりしたら是非お手伝いをお願いしたいくらいなのが本音ですが)。

Page 15: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

15

第1章 Javaによるオブジェクト指向プログラミング

1.1 構造化プログラミングとオブジェクト指向言語

解説

受講者の皆さんは,すでにプログラミングの体験者であることを想定していますが,Javaについては初めて学習する方も多いと思います。ここでは,旧来のプログラミング言語との違いを理解して頂くためのステップとして,オブジェクト指向という概念について話をすすめていきます。また,関連する構造化プログラミングという基礎概念についても整理しておきましょう。

1.1.1 構造化プログラミング

現在のコンピュータのハードウェアは,図 1.1に示されているように,大きくは5つの装置から成り立っています。全体の動作を決めるプログラム(命令コード=マシン語)は主記憶装置にあり,マイクロプロセッサによって自動的に読みとられ,同じく主記憶装置にあるデータを加工していくように作られています。主記憶装置上のデータやプログラムは二進数で表現された数値(信号)であり,マイクロプロセッサから見ると両者の区別は基本的にはありません。この方式は,融通性には欠けるものの動作は速くなるという利点があります。しかし,コンピュータの能力が次第に評価され,動作速度が改善されてきた結果,より融通性のあるプログラム方式が求められ,ハードウェアではなくソフトウェアによる方式(ストアードプログラム)が一般的となってきたわけです。このことにより,同一のハードウェア上で「ワープロ」や「表計算」「ゲーム」といった異なるプログラムを利用することが可能となってきたわけです。ソフトウェアによるプログラミングの利点が認知されるようになると,生産性を高めるために,一度作成したプログラムの再利用を目的に,プログラムを部品化して作成するというスタイルが定着しました。多くのプログラミング言語で,サブルーチン(副プログラム・副手続き)や関数などと呼ばれるものが利用できます。これを利用することで,別々の開発者(場合によってはチーム)がサブルーチンごとに開発を担当する際に,サブルーチンの呼び出し方の取り決め1だけを全体で決めておき,実際の副プログラムの内容は担

1プログラム間のインタフェースという意味で,略語として API(Application Program Interface)と呼ばれることがあります。

Page 16: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

16 第 1章 Javaによるオブジェクト指向プログラミング

制御装置

演算装置

主記憶装置入力装置 出力装置

補助記憶装置

主記憶装置にセットされた命令コードを解釈し、全体の動作を制御する

命令コードによって指示された計算を行なう

演算装置で使うデータとプログラムや計算結果を一時的に記憶する

(同時には主記憶装置にセットしきれない)データやプログラムを恒久的に記憶する

データを画像や音声などに変換する(人間に理解できる形でなくともよい)

外部より得た信号をディジタル化し、主記憶装置にセットする

コンピュータ本体

マイクロプロセッサ

図 1.1: コンピュータの基本構成

当者に任せる,といった開発スタイルが可能になったわけです。もちろん,ひとりの開発者が全体を作っていく場合でも,機能的な部分にプログラムを細分化することは,全体の見通しが立てやすくなるという利点を持っています。このような,部品化してプログラムを表現していくスタイルを構造化プログラミングと呼んでおり,現在でもプログラミングの基本的スタイルとして定着しています。

1.1.2 オブジェクト指向

さて,数あるプログラミング言語の中から,この授業で取り上げるのは Javaです。中級者向けの題材としてはグラフィクス処理が適当であろう,ということが前提にあったのですが,一方でVisual BASICのような特定の環境(Windows)でしか利用できないの

Page 17: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

1.1. 構造化プログラミングとオブジェクト指向言語 17

では実践向きとは言えないだろう,という想いもありました。その点,Javaは環境にあまり依存せず,グラフィクス処理も標準の機能として持ち合わせており,何よりネットワーク時代に対応した言語仕様でもあることから選んだというわけです。さらに,Javaの概要を示した解説の中には,オブジェクト指向言語であることを特徴のひつとして挙げてあるものがあります。オブジェクト指向という言葉が使われ始めたのは 1980年代のことであり,それまでのコンピュータの使われ方(主として科学技術分野の数値計算処理や銀行などでの伝票処理)から人工知能や画像処理などへの応用へと拡がりつつあった時代でした。旧来の手続き重視型(データの加工手順をフロー化して全体の設計を始めるというスタイル)のプログラミングスタイルでは手に負えない状況 — プロセッサの高速化やグラフィック端末の普及 — が生まれつつあったわけです。たとえば,今では当り前のマウスという装置ですが,これは動かすたびにコンピュータ側に割り込み信号(ソフトウェアレベルではイベントと呼ばれます)を送りつづける仕組みになっています。旧来型のプログラミングでは,プログラム側で明示的に調査しないとマウスの動きを追っていくことができません。これに対して,イベント駆動型というプログラミングスタイルが確立され,主たるプログラムの中ではマウスの動きについては関知せず,マウスが動いた時に呼び出される専用のサブルーチンを別立てにしておく,ということが表現しやすくなってきました。

データ入力(体重)

データ入力(身長)

計算処理

結果の表示

手続き重視型(データの入力順はプログラムによって規定される)

データ入力(体重)

データ入力(身長)

計算処理

結果の表示

イベント監視

イベント駆動型(データの入力順はユーザが規定)

計算体重

身長

肥満度はxxxです

プログラムの指示するまま受動的に入力

任意の順序で能動的に入力

データ変更 クリック

図 1.2: 手続き重視型とイベント駆動型の比較

つまるところ,ハードウェアの進歩にそれまでのプログラミングスタイルが追いつかなくなったことの必然の結果として,現実のハードウェアに見合ったプログラミングスタイルが生まれてきたのです。さらに,ハードウェアばかりでなく,複数の図形を個別にコン

Page 18: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

18 第 1章 Javaによるオブジェクト指向プログラミング

トロールしたいような場合に,それぞれの図形をオブジェクトという概念でとらえ,オブジェクトごとの共通部分をクラスという概念で抽象化することによって,クラスごとに属性・機能を書き下すというスタイルが生まれました。これが,オブジェクト指向というプログラミングスタイルの始まりです。オブジェクト指向を明確に意識した初の言語としては Smalltalkが有名で,その開発の発端はタートルグラフィクスと呼ばれる図形描画機能を備えた幼児向け教育に設計された LOGOという言語であると言われています。

LOGOによるグラフィクス制御の例

タートルの軌跡を前進(forward),方向転換(right,left)などで制御して描画している。

図 1.3: LOGOにおけるタートルグラフィクス

現在のコンピュータでは,メニュー・ダイアログ(対話画面)・マウス・ボタン・ウィンドウといったディスプレイ上に表示された機能的部品の操作を中心に行なわれるGUI(=GraphicalUser Interface)ベースの操作方法が一般的ですが,これらもオブジェクトの集合といったとらえ方をすることによってプログラミングされているわけです。したがって,非常に乱暴な言い方をすれば,GUIベースのプログラムを作るにはオブジェクト指向の言語を利用するのが合理的である,ということなのです。

ここでちょっと休憩

Page 19: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

1.2. Javaプログラムの実例 19

1.2 Javaプログラムの実例

【重要】

実習室のパソコン利用にあたっては,部外者が操作できないように,利用開始時に各自に与えられているユーザ名とパスワードとが必要です。事前に,事務室の窓口にて各自で確認しておいてください。実習室備え付けの利用者用マニュアルもありますので,適宜参考にしてください。

実習いよいよ,Java言語によるプログラミングの体験学習を始めます。まずは,実習室のパソコンの起動を行ない,Webページ上に用意されたプログラム例を実行してみるところから始めましょう。

1.2.1 パソコンの起動とWindowsの起動

キーボードと本体の関係やスイッチ類の場所をあらかじめ確認しておいてから,電源を入れて下さい。電源を入れてしばらくすると,画面上に「ログオンするには Ctrl+Alt+Delキーを押してください」というメッセージのボックス2が表示されます。指示に従って,キーボードのCtrl キーを押しながら(指は離さず),さらに Alt キーを押しながら, Delete キーを押して,その後,すべてのキーから指を離します。「ログオン情報」というタイトルのダイアログが表示されたら,キーボードを使って,

「ユーザ名」欄と「パスワード」欄に正しく文字を入力します。なお,パスワード欄に入力した文字はすべて「*」という文字になりますので,文字数だけ確認してください。

OK ボタンをクリックしてしばらく待つと,Windowsのデスクトップが表示されます。

1.2.2 プログラム例の実行

私の本務校である横浜市立大学のWebページ上に,この授業のためのホームページを設けてあります。いきなり,Javaによるプログラミング作業では,とまどいもあるかと思いますので,Webページ上に準備されたプログラムの例を実行して,Javaによるプログラムの特徴をつかんでみましょう。

1. デスクトップの「インターネットエクスプローラ (Internet Explorer)」をダブルクリックします。放送大学のトップページが表示されます。

2. 「アドレス」をクリックして,キーボードからhttp://sakkun.cc.yokohama-cu.ac.jp/

と入力し, Enter キーを押します。

3. 表示されたページの中から「2008年度担当授業一覧」をクリックし,さらに一覧表の中の「放送大学・プログラミング実習 (Java)」の「教材」をクリックします。

2Windowsの世界ではダイアログと呼んでいます。

Page 20: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

20 第 1章 Javaによるオブジェクト指向プログラミング

4. 表示されたページの中から,「Javaアプレット・サンプル」をクリックします。

5. プログラム例ごとに簡単な説明が表示されていますので,ひととおり読んだら順番に「実行する」をクリックしてWebブラウザ内でプログラムが実行されることを確認していきましょう。ひとつのプログラムの実行が終ったら,Webブラウザの「戻る」ボタンで画面を一覧に戻します。

6. 「ソースを見る」をクリックすると,そのプログラムのソースプログラムの内容をブラウザ内で確認できます。ソースの内容は分冊で用意した第 II 編にありますので,自分の知っているプログラミング言語と比較して,気の付いた点などを控えるのに利用してください。

7. ひとつの例題の実行とソースプログラムの確認が終ったら,同様の手順で別のプログラムも試してみてみましょう。

各プログラムの部分には,そのプログラムのポイントとなる事項について簡単に説明を記入してあります。この部分は,プログラムの実行内容にはまったく無縁の「覚書き」としてだけの役割を持っています。この部分 — 注釈 — の書き方には早めに馴染むようにしてください。余力のある方は,演習問題(第 II編の 71頁以降)も手掛けてみましょう。

1.2.3 教材のセットアップ

前節で見ていただいたプログラム例は,この授業での学習内容にもなっています。原則として,プログラム例の内容をつかめたら,これに手を加えて発展させていくことで Java言語によるプログラミングのポイントを掴んでもらうように進めていく予定です。一部,まったく新規にプログラムを作成してもらうこともありますが,以上のプログラム例については手元のパソコンにダウンロードして利用できるようにしてあります。以下の手順でダウンロードしてください。

1. Webブラウザがまだ起動されていれば,「放送大学・プログラミング実習 (Java)」のページまで戻します。

2. 画面の中から 「プログラム例のセットアップ」 の部分をクリックします。

3. ダイアログが開かれたら,「実行」をクリックします。

4. セキュリティ警告が表示された場合は,(害のないプログラムであることを信用しつつ)続行させてください。

5. 保存先を示すダイアログが開かれたら,「z:¥」であることを確認して, OK をクリックします。

Page 21: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

1.2. Javaプログラムの実例 21

6. 自動的にプログラムの解凍が行なわれ,z:ドライブに jsamplesフォルダが作成され,このフォルダ中に教材のファイルがコピーされます。

以上で,プログラムのダウンロードは終りです。誤操作などでプログラムを削除してしまわない限り,繰り返して操作する必要はありません。

ここでちょっと休憩

Page 22: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し
Page 23: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

23

第2章 Javaによるプログラミングの実際とグラフィクス

2.1 プログラミングツールの使い方

実習 いよいよ,プログラミングツールを使ってのプログラミング体験です。

2.1.1 Sunの SDK - JDK

Sun Microsystemsから無償配布されている開発キット(一般にはSoftware DevelopmentKit=略して SDK,特に Java用ということで Java Development Kit=略して JDK )には,バイトコードコンパイラ (javac),バイトコードインタプリタ1(java),アプレットビューア (appletviewer)などが含まれています。バイトコードとは,一般のプログラミング言語でいうところの実行可能ファイルと本質的には同じものです。また,アプレットとは,独立して動作するアプリケーションと区別して使われる用語で,別のプログラムに組込まれて動作する「小さなアプリケーション」という意味あいです。

【余談】標準の SDK(Java2 Development Kit, Standard Edition = 略して J2SE)は SunのWebページ上で無償配布となっていますので,Windows98以降の場合,マシンの性能が Pentium II以降でハードディスクに 100MB程度以上の余裕があれば,SDKをインストールすることで,自宅や職場でも開発環境を手軽に手に入れられます。市販の参考書類には,付録 CD-ROMに SDKを納めているものもありますので,インターネット環境のない方(あっても速度が遅い方)は,こうしたものを利用するのも手でしょう。

学習センターにもこの JDKがインストールされていますので,これを中心に使用します。

2.1.2 プログラミングツールの使い方

上に述べたように,この授業では本家の SDKを用いたアプリケーション開発の手順を体験していただきます。次の手順で,コマンドプロンプトを呼び出して準備します。

1. スタート ボタンから ファイル名を指定して実行 を選択する。

2. ダイアログ内に, cmd と入力する。1仮想マシンとも呼ばれる

Page 24: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

24 第 2章 Javaによるプログラミングの実際とグラフィクス

3. 現れたコマンドプロンプトの画面内で,z:,cd jsamplesと2つのコマンドを入力する。コマンドの最後はいずれも Enter を入力する。(教材を解凍したフォルダに移動する)。

準備が整ったら,例題を用いてコンパイルと実行の手順を確認しましょう。

1. javac sample01.java Enter と入力する

2. dir Enter と入力し,sample01.classが生成されたことを確認する

3. start sample01.html Enter と入力しプログラムが実行されたことを確認する

以上の手順は,あらかじめソースプログラム sample01.javaやアプレット表示のための HTMLファイル sample01.htmlが準備されていることを想定したものです。実際には,ソースプログラムもプログラマである我々が準備する必要があります。これらのファイルはテキストファイルになっているので,Windowsに標準装備されている「メモ帳」などのテキストエディタで作成・編集が可能です。メモ帳では物足りない人は,授業のホームページに CPad for J2SDKのダウンロードページへのリンクがありますので,これを z:ドライブ上にダウンロードして展開し,利用する手もあります。Java言語の予約語に対して自動的に色が付けられるので,スペルミスなどのチェックが容易になり,行番号も表示されますので,デバッグ作業にも有効です(詳細は別紙資料を参照してください)。

表 2.1: プログラミングツールの使い方

作業内容 使い方ソースプログラム notepad "filename.java"

の編集 テキストエディタであれば何でもよい。notepad(メモ帳)を使う場合は,ファイル名の前後の"も忘れないこと。

コンパイル javac filename.javaアプリケーションの実行 java filename

アプレットは単独では動作できないので,<applet>タグによる呼出しを含む HTMLファイルを別途準備しておく。

アプレット appletviewer webpage.html実行 Windowsでは

start webpage.htmlとしてWebブラウザでも実行できる。

2.1.3 Javaプログラムの動作環境

ここで,Java言語によるプログラムの動作環境について紹介しておきましょう。

Page 25: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

2.1. プログラミングツールの使い方 25

ご存知の方も多いと思いますが,Javaで作成されたプログラムは(一定の条件下では)ネットワークを通してさまざまなコンピュータ上で実行できます。通常のプログラミング言語では,Windows上で開発されたプログラムは Windows上でしか動作せず,MacOS上で動作させるためには MacOS用に再コンパイルする必要があります。これに対して,Javaでは,Windows上で開発されたプログラムであっても MacOSや Linux上で実行できるという特徴を持っているのです。このからくりは Javaの動作環境に秘密があります。図 2.1に一般の言語との対比で示してあるように,コンパイルされたファイルは,どのOSでコンパイルされたものであっても,実質的に同じものが生成されます。OSは,一般にハードウェアの差異を吸収するために実行プログラムとハードウェアとの仲立ちをしていますが,Javaではさらに,OSの差異をなくすための仮想的機械(Virtual Machine=略してVM)を実行プログラムと OSの間に置くことを前提にしています。VMそのものは OSに依存しますが,いったんインストールしてしまえば,Javaで作られたプログラムであればどんなものでも実行できるというわけです。

Page 26: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

26 第 2章 Javaによるプログラミングの実際とグラフィクス

ソースプログラム

Windows用Compiler

Linux用Compiler

MacOS用Compiler

Windows実行ファイル

Linux実行ファイル

MacOS実行ファイル

Windows

ハードウェア

Linux

ハードウェア

MacOS

ハードウェア

ソースの段階では互換性があるが,コンパイル後は使用するOSの下でのみ動作するファイルとなるためバイナリ互換性はない。

一般のコンパイラ型言語

ソースプログラム

Windows用Compiler

Linux用Compiler

MacOS用Compiler

バイトコード(classファイル)

Windows

ハードウェア

Linux

ハードウェア

MacOS

ハードウェア

ソースの段階での互換性もあるが,コンパイル後は使用するOSに依存しないファイルとなるためバイナリ互換性もある。ただし,OSごとに実行環境を提供するJava Virtual Machineを準備する必要がある。

Java言語

バイトコード(classファイル)

バイトコード(classファイル)

Windows用Java VM

Linux用Java VM

MacOS用Java VM

図 2.1: 一般のコンパイラ型言語の実行環境と Javaの実行環境との違い

Page 27: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

2.2. グラフィクスの基礎と Javaの描画メソッドの使い方 27

2.2 グラフィクスの基礎と Javaの描画メソッドの使い方

手始めにJavaを使ったグラフィクス処理を行なってみましょう。プログラム例sample01.java

を元に,手を加えてみます。

2.2.1 グラフィクスの基礎

解説まず,グラフィクスの一般的基礎について説明していきます。Java だけでなくコンピュータでのグラフィクス処理にも通用する常識的な事項です。

垂直座標

水平座標0 width-1

0

height-1

height

width

色を表示するための光の点(ピクセル)色を個別に指定することで図形を表現していく

0

1

2

3

4

5

6

0 1 2 3 4 5 6

間隔はディスプレイ上では 1/72 - 1/75 インチ程度。ディスプレイの能力や解像度によって若干異なる。

R

G B

色はRGBの強さを個別に数値(0~255)で制御

図 2.2: コンピュータグラフィクスにおける座標系のとり方と色の表現方法

図 2.2に,その概要を示します。コンピュータ上の画面や画像ファイルは,光の点(ピクセル)の集まりとして表現されます。ピクセルは画面上に碁盤目状に規則的に並べられています。コンピュータで制御するためには,位置を特定して該当するピクセルの色を指

Page 28: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

28 第 2章 Javaによるプログラミングの実際とグラフィクス

示する必要があります。位置は縦横の座標値で示しますが,数学などで通常用いられている座標系と異なり左上が原点となっていることに注意してください。また,色は光の三原色である Red, Blue, Green の合成色として表現します。Javaでは,各色の強さを 0から255までの 256段階(1バイトで表現するため。28 = 256)で決めます。0は該当する色を全く使用しないことを意味し,255は最大の強さであることを示します。

Java固有の話として,図 2.2に示されている widthと heightについて補足すると,これらの値はアプレットを呼び出す HTML ファイル側で決めるのが通例です。もし,指定した大きさより大きな図形を描画しても,その部分は画面上には現れません(エラーにもなりません)。通常のパソコンの場合,画面全体は 1024 × 768 の大きさとなっていますから,これを手がかりに適当な大きさを指定しておけばよいことになっています。

2.2.2 Javaの描画メソッドの使い方とプログラムの改変

実習

では,Javaの文法的な話は最小限にとどめ,第 III編(文法編)を参照しつつ「習うより慣れよ」式で進めていきます。プログラミング言語を一通り知っている方(特にC言語に馴染んでいる方)であれば,どこを修正すればよいかの見当もつくでしょうし,その結果どのように変化するのかを体験的に学んだ方が早く身につくと思われるからです。

コンパイルとソースプログラム修正の手順

さて,実際の描画においては,ピクセルごとに色を指定していたのではキリがありませんので,基本的な図形については,図形の特徴点(線分なら両端の座標値)を指示することで間のピクセルについては補間してくれます。プログラム sample01.javaでは,図形の描画を,

g.描画メソッド ( 引数【,引数...】 ) ;

で表現してあります。メソッドとは,Javaのプログラムにおけるプログラムの単位のひとつで,一般の言語ではサブルーチンや副手続きなどと呼ばれるものに相当します。描画

メソッド個別の使い方(ひきすう

引数の意味)は文法編を参照してください。ダウンロード直後の状態では,ソースプログラムのみしか存在しませんので,いったんコンパイルして動作するか確認してみましょう。コマンドプロンプトから次の手順で行ないます。

z:¥jsamples> javac sample01.java

z:¥jsamples> start sample01.html

うまく動作することを確認したら,テキストエディタを用いて sample01.javaに手を加えていきましょう(「メモ帳」を使う場合は,コマンドで notepad "sample01.java"

Page 29: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

2.2. グラフィクスの基礎と Javaの描画メソッドの使い方 29

として起動)。座標値を適当に修正して思惑通りの図形となるか試します。修正後,上書き保存をして,コンパイルを再度行ないます。動作の確認はWebブラウザ側で Ctrl を押しながら「更新」ボタンをクリックすれば,起動し直す必要はありません。

2.2.3 練習

色の変更

座標値や図形の大きさの制御のポイントが飲み込めたら,図形の色を変えてみましょう。標準的な色には名前が付けられていますので,該当する描画命令の前に次のようなスタイルで,色の変更命令を加えます。

g.setColor( Color.色の名前 ) ;

標準色以外の色を用いるときは,

g.setColor( new Color(赤の強さ,緑の強さ,青の強さ) ) ;

というスタイルにします。強さは,0~255までの整数値で指定します。

簡単な図形描画プログラムの作成問題

では,ここで練習問題をひとつ。「日本の国旗」を描画するプログラムに仕立て直してください。余力のある方は,他の国の国旗(いわゆる3色国旗系が楽でしょう)も同時に描画するようにしてみてみましょう。プログラム例をそのまま使っても構いませんし,新規作成,あるいは別名保存を使っても構いません。新規に作成する場合や別名保存する場合は,プログラム内の名前(クラス名)とファイル名を一致させておくことに注意してください(ファイル名の最後は常に.javaとすること)。新規作成あるいは別名保存で作成した方は,対応する HTMLファイルも作成する必要があります。

ここでちょっと休憩

Page 30: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

30 第 2章 Javaによるプログラミングの実際とグラフィクス

2.3 Javaの変数定義と演算・制御構造

実習

プログラミング言語としての Javaの基本について解説します。C言語などをお手本に設計されていますから,それほど違和感なく飲み込んで頂けると思います。大まかな部分が理解できたらプログラム例を使って内容を確認していきます。

2.3.1 変数と型

多くのコンピュータ言語と同様に,データを表現するためには変数を用います。また,数値には整数・実数の区別(型)があり,それぞれ使い分けます。

変数の型宣言

型をまったく用いない(ひとつの型しかない)プログラミング言語や,変数の宣言をしなくても自動的に型が決まる(暗黙の型宣言)ようなプログラミング言語も存在しますが,Javaでは,明示的に型宣言する必要があります。実際に使用する(値を代入したり,参照したりする)以前であれば,どのタイミングでも宣言が可能です。基本のパターンは,

型名 変数名【,変数名...】;

となります。変数名の後ろに 「=定数および互換性のある式表現」 を追加すると,宣言とともに値を代入することも可能です(いわゆる初期値設定)。数値以外のデータ,すなわち文字列やオブジェクト(後述するGUI部品など)も同様の形で定義して使用しますが,型名の代わりにクラス名を用いることになります。

配列

配列の定義も,もちろん行なえます。配列の添字は次元ごとにブラケット [ ] で括ります。添字の基底値は常に 0ですから注意してください。

2.3.2 制御構造

これも,多くのコンピュータ言語と同様に,条件分岐・反復処理を表現するための構文が備わっています。

Page 31: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

2.3. Javaの変数定義と演算・制御構造 31

条件分岐

予約語 ifと elseを用います。条件式の表記は,C言語流です。特に,等しいかどうかを判断する比較演算子は == と等号 2個を用いるので注意が必要です。その他多重の分岐を表現するための switch ~ case ...の構文もあります。

反復表現

予約語 for や while,do を使った構文が用意されています。これらも,C言語流の使い方になります。

2.3.3 練習

では,前節と同様の手順で,sample02.javaを使って制御構文や変数の扱い方の練習をしてみましょう。前節の作業が終ったら,いったんエディタやWebブラウザを閉じて(コマンドプロンプトはそのままでいい),改めて sample02.javaをエディタで呼び出しましょう。とりあえずは元のプログラムがうまく動作することを確認して,以下のような改変をしてみてください。

線の形を変える

線の形を決めている部分をプログラムから読みとって,適当な形に変えてみてください。

線の数を変える

線の数を決めている部分をプログラムから読みとって,適当な数に変えてみてください。線の数を増やす時は,色の変更部分にも気を配りましょう。

平行移動の幅を変える

平行移動の幅を決めている部分をプログラムから読みとって,幅を変えたり,線の順番によって移動幅が変化するようにしてみてください。

Page 32: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

32 第 2章 Javaによるプログラミングの実際とグラフィクス

2重の反復処理に拡張する

垂直方向にだけ平行移動させていますが,水平方向にも移動させたり,格子状になるように 2重ループを構成してみてください。

ここでちょっと休憩

Page 33: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

33

第3章 JavaによるGUIの制御

3.1 GUIの基礎

解説

これまでのプログラムは,動作内容をプログラムの内部に埋め込んでいたために,パラメータ値を変えたりするたびに再コンパイルが必要でした。これを避けて,より融通のきくプログラムにするためには,一般のプログラミング言語でも備わっている入出力の機構を使用する必要があります。コンソールからの入出力機構も利用できますが,ここではGUIベースでの話に限定しましょう。

3.1.1 GUI部品を構成するクラス

旧来のコンピュータでは,コマンドと呼ばれる文字列を中心に,キーボードから各種の操作命令を入力して制御していました。最近のコンピュータでは,Windowsのようにマウスを中心とした利用形態に変化しており,その形態のことを Graphical User Interface(略してGUI)と 呼びます。Javaには,GUIを表現するための部品(オブジェクト)が標準で備わっています。一般にGUIベースのアプリケーションでは,ラベル文字列・ボタン・テキスト入力フィールド・スクロールバー・チェックボックスなどが使用されますが,Javaでも,これらに対応したGUI部品に関連づけられたクラスライブラリ1 AWT(Abstract Window Toolkit)や,さらに見栄えもよく使いやすくなった Swingと呼ばれる Toolkitがあらかじめ用意されています。

3.1.2 GUIオブジェクトとリスナー

画面上に配置したオブジェクトを使って,プログラムの制御やデータの入出力を行なうためには,イベント処理に関する表現方法を知る必要があります。

GUIオブジェクトは,通常,new命令で生成して使用します。画面への配置は,init()

メソッド内で add()メソッドを用いて行ないます。add() を実行した順番に,適当な位置に配置されてしまいますが,配置を好みに合わせるためには,レイアウトマネージャを制

1ライブラリとは,よく利用されるプログラムの部品をあらかじめパッケージにまとめたもの。ツールキットも同様の趣旨であるが,特に図形処理や GUI用の部品などをまとめたものに限定して呼ぶことが多い。

Page 34: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

34 第 3章 JavaによるGUIの制御

Label

Choice

ButtonCheckbox

Scrollbar

TextField

TextArea

Canvas

Checkbox(grouped by

CheckboxGroup)

図 3.1: GUI部品とクラスの例(sample03.javaの実行画面)

御する必要が出てきます(今の段階では,配置の制御には特別な手続きが必要だとだけ覚えておきましょう)。配置はこのようにして行なわれ,実際の画面への表示は paint()メソッドの呼び出しとともに行なわれます。しかし,これだけでは対話的なデータの受渡しはできません。たとえば,ボタンをクリックした際に,その時点でのデータを読みとらせるには,クリックされたかどうかを知る必要があります。このような場合には,オブジェクトに対してイベントが発生した場合に呼び出される専用のメソッドを定義して,関連づけを行なう必要があります。このような目的–イベントの発生を受け取るため–のメソッドを特にリスナーと呼びます。

GUIのオブジェクトによって呼び出されるリスナーは決まっているので,GUI部品と目的に応じて関連づけを行ない,リスナーの実体を再定義(オーバーライト)しておきます。

Page 35: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

3.2. GUI部品を使ったプログラム例 35

3.2 GUI部品を使ったプログラム例

実習それでは,GUI部品の使い方を具体的に見ていきましょう。サンプルとして用意した sample03.javaを観察した後,sample04.javaを使って簡単な改造を施してみます。

3.2.1 GUI部品使用の基本形

AWTには,前述のようにボタンやチェックボックス,テキストフィールドなど最小限必要なGUI部品が備わっています。sample03.javaは,そのほとんどを網羅した形で組み立ててあります。まず,これをそのままコンパイルしたら,ブラウザで確認してみてください。確認できたら,次のような基本形を参照して,プログラムの内容を解読してみましょう。

import java.applet.Applet;import java.awt.*;import java.awt.event.*; // イベント処理のために追加

public void クラス名 extends Appletimplements リスナー { // 必要なリスナーを用意

// インスタンス変数を定義(クラス内で共有するのでメソッドの外で定義)GUI部品クラス名 GUI部品名 ;

public void init() { // 初期化メソッドで GUI 部品を生成・取り付けGUI部品名 = new GUI部品クラス名 (初期化パラメータ) ;add(GUI部品名) ; // add()で部品を画面に配置。デフォルトでは左から順にGUI部品名.リスナー登録メソッド (オブザーバ) ; // オブザーバは通常 this

}

public void イベント処理メソッド ( イベントクラス イベント変数 ) {// 調査したい GUI部品からのイベントかどうかの検査if( イベント変数.getSource() == GUI部品名 ) {部品からの情報の取得/部品の状態の変更など

}}

…}

表 3.1に,GUI部品と各メソッドとの対応を整理しておきましたので,これも活用してみてください。

3.2.2 マウスのイベント処理の基本形

マウスを用いた場合の処理の基本形を以下のようになります。上記の各種 GUI部品との併用はもちろん可能です。

Page 36: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

36 第 3章 JavaによるGUIの制御

表 3.1: GUI部品のイベントの種類とその処理メソッド

クラス(部品) リスナー/リスナー登録 イベント処理/イベントクラスButton ActionListener actionPerformedTextField addActionListener ActionEventTextAreaChoice ItemListener itemStateChangedCheckbox addItemListener ItemEventScrollbar AdjustmentListener adjustmentValueChanged

addAdjustmentListener AdjustmentEvent

import java.applet.Applet;import java.awt.*;import java.awt.event.*; // イベント処理のために追加

public void クラス名 extends Appletimplements MouseListener, MouseMotionListener {

public void init() {…addMouseListener(オブザーバ) ; // オブザーバは通常 thisaddMouseMotionListener(オブザーバ) ;

}

// 以下の5つのイベント処理メソッドは MouseListener に対応public void mousePressed(MouseEvent e) {【ボタンが押された時の処理】

}public void mouseReleased(MouseEvent e) {【ボタンが離された時の処理】

}public void mouseClicked(MouseEvent e) {【ボタンがクリックされた時の処理】

}public void mouseEntered(MouseEvent e) {【ボタンがパネルに入った時の処理】

}public void mouseExited(MouseEvent e) {【ボタンがパネルから出た時の処理】

}// 以下の2つのイベント処理メソッドは MouseMotionListener に対応public void mouseMoved(MouseEvent e){【マウスが動いた時の処理】

}public void mouseDragged(MouseEvent e) {【マウスがドラッグされた時の処理】

}

Page 37: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

3.2. GUI部品を使ったプログラム例 37

…}

表 3.2に,マウスイベントと各メソッドとの対応を整理しておきましたので,これも活用してみてください。

表 3.2: マウスのイベントの種類とその処理メソッド

リスナー/リスナー登録 種類 イベント処理メソッドMouseListener ボタンを押した mousePressedaddMouseListner ボタンを離した mouseReleased

クリックした mouseClickedパネルに入った mouseEnteredパネルから出た mouseExited

MouseMotionListener 動いた mouseMovedaddMouseMotionListener ドラッグした mouseDragged

マウスイベントのクラスはすべて MouseEvent で統一されています。また,GUI 部品のように個々の部品ではなく,指定されたパネルやキャンバスなど全体に割り付けます。さらに,同じリスナーのグループでは,たとえ何もしなくてもユーザ側のメソッドとして定義しておく必要があります。

3.2.3 sample04.javaの実行と改変

それでは,おおよその感じがつかめたら,機能をしぼった sample04.javaを使って理解度を確認してみましょう。例によって,コンパイルして動作を確認したら,以下のような拡張を行ってみてください。

背景色の変更

肥満度の判定結果によって,パネルを色分けしてみましょう。パネルを塗るには,paint()メソッドを追加して,fillRect()を使う必要があります。イベント処理のメソッドからpaint()を直接呼ぶことはできませんので,代わりに repaint()を呼ぶのがポイントです。判定結果をどう伝えるかは,いろいろな方法が考えられますが,以下のヒントを参照に工夫してみてください。

• 色変更の指示は引数では渡せない(repaintに余分な引数を指示できない)ので,共有のColorクラスの変数を用意しておきましょう。たとえば, Color bgColor = Color.lightGray ;のようにしておきます。

• リスナー内部で,判定結果に応じた色情報を,上で定義しておいた Color クラスの変数に記憶させるのが簡単でしょう。また,判定直後に画面を書き換えさせるために repaint() ;を追加しておきます。

Page 38: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

38 第 3章 JavaによるGUIの制御

• paintメソッドでは,判定結果に応じて設定された色情報を用いて,setColorで描画色を変更し,fillRectで,原点を起点に画面全体に四角形を描きます。四角形の大きさは,適当に大きな数値を使っても構いませんが,getSize().widthで画面の幅,getSize().heightで画面の高さが得られるので,このことを利用して fillRectの引数に直接与えることもできます。

BMIの計算

余力のある方は,BMIの計算方法を調べて,この値を表示できるように改造してみてください。BMIによる標準体重の範囲は,おおよそ 20 ~ 24 です(22がちょうどよい)。さらに余力のある方は,グラフで判定結果を表現してみましょう。

ここでちょっと休憩

Page 39: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

3.3. マウスイベント処理プログラムの作成演習 39

3.3 マウスイベント処理プログラムの作成演習

実習では,最後にマウスイベントを処理するプログラムを作成してみましょう。サンプルとして用意したプログラム sample05.javaを改良していきます。一日目の内容をすべて含んだ総合問題です。

3.3.1 sample05.javaの実行と改変

例によって,コンパイルして動作を確認したら,以下のような拡張を行ってみてください。

ドラッグへの対応

このままではクリックにのみ反応してシンボルを描くプログラムとなってしまっています。適切なリスナーやメソッドを追加して,ドラッグした時もシンボルを描くように改造してみてください。

形・色の追加

このままではシンボルは3種類しか選べません。適当なシンボルを追加して,切替えられるようにしてみてください。また,色も4種類ですので,もっとたくさんの色を指定できるようにしてみてください。

大きさの制御

適当な GUI部品を追加して,シンボルの大きさを指定できるようにしてみてください。

3.3.2 終了の手順

すべての練習問題をこなせた人も,そうでない人も,お疲れ様でした。最後に,起動したコンピュータの終了方法について説明しますので,必ず,以下の手順にしたがって電源を切ってください。

Windowsの終了

パソコンの電源を切る時の原則は,使用したアプリケーションはできるだけ自身で終させておくことです。特にプログラムを編集中で保存しないままに終了操作を行うと,トラブルの元になりますので,気を付けましょう。終了のさせ方自体は,通常のWindowsパソコンと同様に スタート ボタンから シャットダウンを選んでください。Windowsがパソコンの電源を自動的に切ってくれますので,電源ス

Page 40: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

40 第 3章 JavaによるGUIの制御

イッチには触れずにしばらく待ちます。長くても1~2分程度で自動的に電源が切れますので,そのまま見守ってあげてください。

Page 41: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

41

第4章 Javaによるアニメーション表現

4.1 アニメーション表現の基礎

解説

1日目は,図形を描画するためのメソッドと GUIによる制御のための書き方を体験していただきました。2日目は,これらの基本機能をさらに発展させ,動きのある表現 – アニメーション表現 – の基礎について学んでみましょう。

4.1.1 アニメーション表現の原理

アニメーション表現の原理は,いわゆるパラパラ漫画のように,徐々に異なる画像を連続的に変化させることにあります。たとえば,ボールの動きをアニメーションで表現するには,ボールの位置を少しずつずらせた画像を,一定の時間間隔をおいて連続で表示させればよいのです1(図 4.1)。

紙芝居やパラパラ漫画のように,少しずつ異なる絵を連続的に描画

第1コマ 第2コマ 第3コマ 第4コマ

残像時間を考慮して,1コマ描き,しばらく休止させてから,次の1コマを描く

図 4.1: アニメーションの原理

1ちなみに,いわゆるアニメーション映画では,1秒間に 24個程度の画像が使用される。つまり,約 0.05秒にひとつの画像が目に飛び込んできている。

Page 42: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

42 第 4章 Javaによるアニメーション表現

4.2 Javaによるアニメーション表現の実際

解説 アニメーションの原理を理解して頂いたところで,Javaによる表現方法について学んでみましょう。

4.2.1 Java言語によるアニメーション表現

Java言語でアニメーション表示を実現するには,いくつかのポイントを押えておけば,さほど難しくはありません。大まかには,全体の動きを表現する関数 (run) と,ひとつの画像(コマ)を表示する関数 (paint)とに分けて考えます。run では,画像表示の命令→いったん休止→次の画像の準備,といった動作を所定の回数あるいはある条件を満たすまでの反復処理で表現しておきます。この時,たとえば,動かす図形の位置情報を変数に保持させておいて,これをpaintの中で参照して図形を描画させればよいのです。これを図式的に示すと,図 4.2のようになります。

初期化 start

終了処理 stop

連続実行のためのメイン処理 run

アニメーションの本体部分を記述する

画面の描画 repaint

sleep()による待機

次のコマのための更新処理

必要なだけの反復

repaintによりpaintが呼び出される

1コマ分の描画 paint共通の位置情報などを手がかりに描画

典型的な例

図 4.2: Java言語によるアニメーション表示プログラムの骨格

休止のためには,Threadクラスの sleepメソッドを用います。よりリアルに再現するには,現実の物理学の法則に従って位置の計算をすればよいのです。このような手法によって,実際のモノを作らなくても,動きの予測 — たとえば,地震動による建物の揺れの実

Page 43: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

4.2. Javaによるアニメーション表現の実際 43

験 — を行なうことができるため,実験の一手法として利用されています2。

4.2.2 sample06.javaと sample07.javaの動作確認と観察

では,1日目にならって,さっそくサンプルで用意したsaple06.javaとsample07.java

をそれぞれコンパイルして動作を確認してください。アニメーション表現するために,どのように改造されているか違いを観察しましょう。

2いわゆるコンピュータ・シミュレーション

Page 44: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

44 第 4章 Javaによるアニメーション表現

4.3 アニメーションプログラムの完成

実習

sample06.javaと sample07.javaの大きな違いは,implementsの後に Runnableという名前(正確にはインタフェースと呼びます)が追加されたことと,Threadクラスの変数の扱い,特に sleep()メソッドの周辺でした。しかし,せっかくのアニメーションもギクシャクとした動きで何か不満に思えませんか?そこで,プログラム例を元に,より滑らかな動きを表現するための定石について学んでいきます。

4.3.1 ダブルバッファ

滑らかな動きを妨げるひとつの要因は,paint()メソッドの呼ばれ方にあります。何も手を打っていないと,このメソッドは,repaint()から間接的に呼ばれる update()内から,画面を背景色でクリアした後に呼ばれるようになっています。通常は,この動作で不都合はないし,むしろ,いちいち画面を消すことを考えなくてすむので好ましい設計ともいえます。ところが,アニメーションのようにできるだけすばやく絵を書き換えようとすると,この消去の動きも目に止まるようになるので,結果としてチラチラして見にくくなるわけです。sample05.javaで気付かれた人もいるかと思いますが,これを避けるためには,標準で用意されている update()メソッドの代わりに自前のメソッドを準備して消去動作を迂回して直接 paint()を呼ぶようにします。このように,標準の機能を書き換えてしまうことをオーバーライトと呼んでいます。ただ,これだけだと前の画面が残ってしまうことになって,自前で消す方法を考えなくてはいけません。ひとつの手は,前の画面と新しい画面で異なる部分だけを描き直すというものです。これは,前の画面の状態をどこかで保持しておく必要もあり,なかなか面倒です。そこで,前の画面の状態にかかわらず,できるだけ高速に画面を切替える手法としてダブルバッファと呼ばれる手法がよく利用されます。簡単に言えば,表示用の画面と(計算を伴うために時間のかかる描画のための)作業用の画面を2つ用意し,作業用の画面での描画が終った段階で,表示用の画面に(個別に図形を描画するよりも一般に高速な)メモリ転送を使って描くというものです。

4.3.2 sample07.javaの改変

それでは,具体的にどのような改変をするか,以下に実際の例をあげてみました。元のプログラムと比較するために,sample07.java を開いたら「名前を付けて保存」でsample07a.javaと変えてから異なる部分に注意して修正してみてください。

ダブルバッファを使用したアニメーション (sample07a.java)

1 // 円軌道を運動するボールの軌跡

Page 45: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

4.3. アニメーションプログラムの完成 45

2 import java.applet.* ;3 import java.awt.* ;45 public class sample07a extends Applet implements Runnable {6 int t = 0 ; // 角度 (deg.)7 double hankei = 150 ; // 軌道の半径8 Thread th = null ;9 Image backImg = null ;

10 Graphics backG = null ;1112 public void start() {13 backImg = createImage(400,400) ;14 backG = backImg.getGraphics() ;15 paintBack() ;16 repaint() ;17 th = new Thread(this) ;18 th.start() ;19 }2021 public void run() {22 while( th != null ) {23 paintBack() ;24 repaint() ;25 t = (t+5)%360 ;26 try {27 th.sleep(10) ; // 10ms = 0.01秒停止28 }29 catch (InterruptedException e) {30 }31 }32 }3334 public void paintBack() {35 double a ;36 int x, y ;37 if( backG != null ) {38 backG.setColor(Color.white) ;39 backG.fillRect(10,10,380,380) ;40 a = (double)t*Math.PI/180.0 ;41 x = (int)( hankei * Math.cos(a) ) ;42 y = (int)( hankei * Math.sin(a) ) ;43 backG.setColor(Color.blue) ;44 backG.fillOval( x+200-10, -y+200-10, 21, 21 ) ;45 }46 }4748 public void update(Graphics g) {49 paint(g) ;50 }51 public void paint(Graphics g) {

Page 46: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

46 第 4章 Javaによるアニメーション表現

52 if( backImg != null ) {53 g.drawImage(backImg,0,0,this) ;54 }55 }56 }

GUI部品による制御

余力のある方は,GUI部品を追加して,動きをとめたり再開するためのオプションを用意してみましょう。boolean型の変数(たとえば isRunning)を共通変数として準備し,ボタンのイベントに対応して,リスナ内で isRunningを trueまたは falseを代入するようにしておきます。run()にも手を加えて,角度を更新している部分を isRunningが trueの時だけ実行するように改造します。また,ボタンのラベルは,実行/停止の状態に応じて,

bt.setLabel("実行") ; bt.repaint() ;

などとすることで切替えが可能ですので,できるならボタンはひとつですますのがスマートです。これもできた方は,回転方向を変えるためのボタンを追加するなどいろいろ試してみましょう。

ここでちょっと休憩

Page 47: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

47

第5章 総合演習

5.1 データ入出力の基礎

解説

さて,これまでのプログラムでは,データは,GUIを通してユーザが指定するか,元々プログラムに埋め込まれていました。より実用的なプログラムでは,大量データの処理を行なわせたり,処理結果をファイルの形で保存させる必要があります。

5.1.1 Javaにおけるデータファイルの扱い

Javaは,当初からネットワーク経由の利用が意識された設計となっているので,アプレットではファイルへの出力が制限されています1。これ以外は,アプレットでもアプリケーションでも使い方に違いはありません。

5.1.2 テキストファイルの読み込み手順

まず,ファイル名と結びつけた InputStreamクラスのオブジェクトを生成します。

●ファイルの指定(ローカルファイルの場合)InputStream f = new FileInputStream( ファイル名 ) ;

●ファイルの指定(ネットワーク経由の場合)URL url = new URL( ファイルの URL ) ;または

URL url = new URL( getDocumentBase(), ファイル名 ) ;InputStream f = url.openStream() ; // urlで示されたファイルをオープン

続いて,BufferedReaderクラスのオブジェクトに結びつけた上で,行単位で入力を行います。

●バッファ入力のクラスへの結びつけinfile = new BufferedReader(new InputStreamReader(f)) ;

●1行単位の読み込みString record ;record = infile.readLine() ; // 必要な数だけ反復

●後始末(クローズ)infile.close() ;

1アプレットでファイルへの出力を許してしまうと,ネットワーク経由で不正なデータを書き込まれたり,ファイルを削除されてしまう悪質なプログラム— いわゆるコンピュータウィルス — を作りやすくなってしまうからです。

Page 48: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

48 第 5章 総合演習

入力データは行単位の文字列として読み込まれるので,必要に応じて,整数値や実数値に変換して利用します。

5.1.3 例外処理

ファイルを扱う時は,例外処理を記述しておきます。例外処理は,ファイルが見つからない,といった想定外の動作に対する処理を記述しておきます。

●例外処理の書き方try {...例外が発生し得る処理...

}catch( 例外クラス e ) {例外処理 ... 例外の詳しい情報は e から取り出す

}// catch( ... ) { ... } は複数書くことが可能

ファイル関連の例外クラスは,FileNotFoundExceptionなどの細かいものも用意されていますが,面倒であれば,IOExceptionで代表できます。

5.1.4 画像ファイルの利用

画像のすべてをプログラムで表現できるとは限りません。特に,写真画像などをそのままアプレット内に表示させたり,ボタンの背景画などに使いたくなる時もあります。画像は Imageクラスのオブジェクトして利用できます。利用する時の概略は,以下のとおりです。

●画像オブジェクトの準備(通常は共通変数として)Image myPict ;

●画像の読み込み(Appletの場合,通常は init()内で)myPict = getImage( getDocumentBase(), ファイル名 ) ;

●画像の描画(Appletの場合,通常は paint()内で)g.drawImage( myPict, 描画開始 X座標,描画開始 Y座標, this ) ;

drawImageはすべての Graphicsオブジェクトに対して使用できますので,sample07a

の裏画面に対しても有効です。画像ファイルは,JPEG,GIF,PNGなどの汎用形式であれば,どんなものでも構いません。Windowsの場合は,BMP形式も利用できますので,「ペイント」で簡単な図形を作画して試してみるのもいいでしょう。なお,画像が大きな場合や,複数の画像を使用する場合は,画像ファイルを完全に読み切ってから処理を進めるために,MediaTrackerを併用するのが安全です。

Page 49: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

5.1. データ入出力の基礎 49

● MediaTrackerを使った安全な画像の読み込みMediaTracker mt = new MediaTracker(this) ; // init()のローカル変数でよいmyPict1 = getImage( getDocumentBase(), "pict1.bmp" ) ;myPict2 = getImage( getDocumentBase(), "pict2.bmp" ) ;mt.addImage( myPict1, 0 ) ; // 画像に識別番号を与えて監視するmt.addImage( myPict2, 1 ) ;try { // 割り込みにより復帰するので try ~ catch を使用

mt.waitForAll() ; // すべての画像を完全に読み切るまで待つ}catch( InterruptedException e ) {}

アニメーションへの応用や簡易フォトアルバムのようなものも実現できますので,余力のある方は試してみましょう。授業のホームページにも見本があります。

Page 50: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

50 第 5章 総合演習

5.2 Javaによるデータ処理と視覚化プログラム

実習 では,総まとめとしてのアプリケーションプログラムを作成してみましょう。処理するべきデータはあらかじめ準備されています。

5.2.1 sample08.javaの実行

sample08.javaは,ファイルに用意されたデータを読み取り,これを棒グラフで表すためのアプレットです。まずは,実際に実行させてみましょう。データファイルの1行目はデータのタイトル,2行目以降は項目名と反応数を収めた行が続きます。項目名と反応数はスペースで区切られていることを前提に,プログラム中で分けて使用しています。

ここでちょっと休憩

Page 51: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

5.3. 総合演習とQ&A 51

5.3 総合演習とQ&A

解説

これで,2日間にわたる Java言語によるグラフィクス処理の体験を終えることになります。旧来的なプログラミング言語しか知らなかった方にとっては,新鮮なプログラミング体験であったかも知れませんし,むしろとっつきにくく感じられたかも知れません。最後の時間は,十分消化できなかった部分をそれぞれで復習して頂き,なおかつ,説明だけでは飲み込めなかった部分について質疑応答に充てたいと思います。

5.3.1 アプレットをアプリケーションとして動作させる手順

この授業では,Webページ内で動作させるプログラム – アプレット – を題材に用いましたが,特にファイルへの書き出しが制限されていることが実用プログラムとしてのネックとなります。このため,より実用的なプログラムとするためには,独立して動作するアプリケーションの骨格も知っておく必要があります。

Javaアプリケーションの要件

GUIを使わない場合も,使う場合も,Javaプログラムの中には,mainというメソッドが必要となります。最も小さなプログラム (GUIを用いない場合)は,たとえば,次のようなものです。

public class myApp1 {static public void main(String[] args) {

System.out.println("*** This is a smallest Java application ***") ;}

}

クラスは,アプレットの場合と同じく,public属性を持つことが必要で,規約にしたがって,このソースプログラムは myApp1.javaという名前でなければなりません。また,mainメソッドは,必ず上記のように,staticで,なおかつ,public属性を持たせておきます。コンパイルは javacコマンドを用いて行ない,javaコマンドにクラス名を添えて実行させます(ただし.classは省く)。たとえば,

Z:¥jsamples> notepad "myApp1.java" 新規に作成 (Aは大文字で)Z:¥jsamples> javac myApp1.java コンパイルZ:¥jsamples> java myApp1 仮想マシンで実行*** This is a smallest Java application *** 実行結果Z:¥jsamples>

また,GUIを使用する場合は,アプレットではブラウザが行なっていた仕事,つまり,ウィンドウを初期化する仕事が必要となります。Javaでは,ウィンドウを生成するための

Page 52: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

52 第 5章 総合演習

Windowクラスが準備されており,ここから派生させた Frameクラス(または JFrameクラス)を用いて利用します。

import java.awt.* ;import java.awt.event.* ;

public class myApp2 {static public void main(String[] args) {// フレーム (ウィンドウ)の生成とタイトルの設定Frame myFrame = new Frame("** My Application using GUI **") ;myFrame.setSize(400,400) ; // ウィンドウの大きさの設定myFrame.setVisible(true) ; // 可視状態に設定myFrame.addWindowListener( // 終了時の処理を登録new WindowAdapter() {public void windowClosing(WindowEvent e) {

System.exit(0) ; // ウィンドウを閉じる際にアプリケーションも終了}

}) ;

}}

これも,クラス名とソースプログラム名を一致させるという規約に従い,ソースプログラム名は myApp2.java でなければなりません。コンパイルの手順,実行の手順は myApp1

の場合と同じです。実行結果は,ウィンドウとなって表示されます(が,中身は何もないので空のウィンドウが表示されるだけです)。

既存のアプレットのアプリケーション化

既存のアプレットがある場合は,それをほぼそのまま利用してアプリケーション化することも可能です。たとえば,sample01.javaをアプリケーション化するためには,run01.javaを次のように作成します。

import java.awt.* ;import java.awt.event.* ;

public class run01 {static public void main(String[] args) {// フレーム (ウィンドウ)の生成とタイトルの設定Frame myFrame = new Frame("** Running an applet as an application **") ;// アプレットの生成sample01 myApplet = new sample01() ;myFrame.setSize(520,450) ; // ウィンドウの大きさの設定myFrame.add(myApplet) ; // アプレットをフレーム内に追加myApplet.init() ; // アプレットを初期化myFrame.setVisible(true) ; // 可視状態に設定myApplet.start() ; // アプレットの動作を開始

Page 53: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

5.3. 総合演習とQ&A 53

// 終了時の処理を登録myFrame.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {System.exit(0) ; // ウィンドウを閉じる際にアプリケーションも終了

}}

) ;}

}

このソースプログラムの中に sample01の実体が定義されていませんが,同じフォルダ内に sample01.javaがあると,コンパイル時に自動的にその内容が参照され,必要ならコンパイルも同時に行なわれるので,わざわざ実体を定義し直す(run01.javaの中に組み込む)必要はありません。実行は,java run01とすることで,アプレット sample01がウィンドウ内に組み込まれて表示されて実行されます。

Page 54: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し
Page 55: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

第II部

プログラム例と演習問題

Page 56: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し
Page 57: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

57

第6章 プログラム例

以下のプログラムは,私の本務校である横浜市立大学のホームページにあらかじめ登録してあります。インターネットエクスプローラを使って手元のパソコンにコピーした上で利用してください。

6.1 第1日で使用するプログラム

6.1.1 プログラム例(sample01.java)

1 // Javaによる Applet作成と図形描画の基本2 import java.applet.* ; // おまじない3 import java.awt.* ; // おまじない45 // sample01はプログラム名 (正確にはクラス名)で,6 // プログラマが任意に設定する (ただしファイル名と一致させておく)7 public class sample01 extends Applet {89 // 一般に描画命令は paint メソッド内に定義する

10 public void paint (Graphics g) {11 // 描画色と背景色の設定12 setForeground(Color.black) ;13 setBackground(Color.green) ;1415 // 座標原点に矢印を描き,座標値を表示16 g.drawLine( 0,0, 50, 50 ) ;17 g.drawLine( 0,0, 3, 10 ) ;18 g.drawLine( 0,0, 10, 3 ) ;19 g.drawString("(0,0)",50,50) ;2021 // 基本図形を表示22 g.drawString( "Rectangles", 50, 110 ) ;23 g.drawRect( 50, 120, 100, 100 ) ;24 g.fillRect( 50, 230, 100, 100 ) ;25 g.drawString( "Round-Rectangles", 210, 110 ) ;26 g.drawRoundRect( 210, 120, 100, 100, 20, 20 ) ;27 g.fillRoundRect( 210, 230, 100, 100, 20, 20 ) ;28 g.drawString( "Ovals", 370, 110 ) ;29 g.drawOval( 370, 120, 100, 100) ;30 g.fillOval( 370, 230, 100, 100) ;31 g.drawString("Line", 50, 350 ) ;

Page 58: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

58 第 6章 プログラム例

32 g.drawLine( 50, 360, 470, 360 ) ;3334 // 右下に矢印を描き,座標値を表示35 g.drawLine( 519, 449, 519-50, 449-50 ) ;36 g.drawLine( 519, 449, 519 -3, 449-10 ) ;37 g.drawLine( 519, 449, 519-10, 449 -3 ) ;38 g.drawString("(519,449)",519-50,449-50) ;39 }40 }

アプレットを起動するための HTML(sample01.html)

sample01.javaはアプレットとして動作しますので,対応する HTMLファイルを準備します。

1 <html>2 <head>3 <title>Java Sample Program (1)</title>4 </head>5 <body>6 <h2 align="center">Java Sample Program (1)</h2>7 <p align="center">8 <!-- アプレットを呼び出すために APPLET という HTMLタグを使用 -->9 <applet code="sample01.class" width="520" height="450">

10 </applet>11 </p>12 </body>13 </html>

HTMLファイルの内容は以下のプログラム例でも同様です。ポイントは,

<applet code="プログラム名.class" width="幅 (ピクセル)" height="高さ (ピクセル)"></applet>

の部分を,呼び出したいプログラムに応じて変えるという点です。したがって,sample02.htmlなどの紹介は省略します。

Page 59: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

6.1. 第1日で使用するプログラム 59

6.1.2 プログラム例(sample02.java)

1 // Javaの変数定義2 import java.applet.* ;3 import java.awt.* ;45 public class sample02 extends Applet {67 // メソッドの外で定義すると,クラス全体で参照できる8 // 初期値を設定しない場合は int[] b_x = new int[5] ; などとする9 int[] b_x = { 50, 100, 150, 200, 250 } ;

10 int[] b_y = { 100, 50, 30, 100, 70 } ;1112 public void paint (Graphics g) {13 // メソッド内では内部でのみ有効14 int i, j ;15 int[] y = new int[5] ;16 // 配色を示すオブジェクトも変数のように定義可能17 Color[] cols = {18 Color.red,Color.green,Color.blue, // 色定数19 new Color(255,255,0) } ; // RGB値による指定も可20 for( i=0 ; i<4 ; i++ ) {21 g.setColor( cols[i] ) ; // 色を変更22 for( j=0 ; j<5 ; j++ ) y[j] = b_y[j]+i*50 ; // 垂直に平行移動23 g.drawPolyline(b_x,y,5) ;24 }25 }2627 }

Page 60: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

60 第 6章 プログラム例

6.1.3 プログラム例(sample03.java)

1 import java.awt.* ;2 import java.awt.event.* ;3 import java.applet.* ;45 public class sample03 extends Applet6 implements ActionListener,7 ItemListener,8 AdjustmentListener,9 MouseListener {

1011 Button bt = new Button("Reset") ;12 TextField tf = new TextField(10) ;13 TextArea ta = new TextArea(10,40) ;14 Choice ch = new Choice() ;15 int colorIndex = 0 ;16 String[] colorNames = {17 "Red", "Green", "Blue", "Yellow", "Magenta", "Cyan", "White", "Black"18 } ;19 Color[] colorObj = {20 Color.red, Color.green, Color.blue, Color.yellow, Color.magenta,21 Color.cyan, Color.white, Color.black22 } ;23 Checkbox cb1 = new Checkbox("Fortran") ;24 Checkbox cb2 = new Checkbox("PL/I") ;25 Checkbox cb3 = new Checkbox("Basic") ;26 Checkbox cb4 = new Checkbox("C or C++") ;27 Checkbox cb5 = new Checkbox("Java") ;28 CheckboxGroup cg = new CheckboxGroup() ;29 Checkbox cg1 = new Checkbox("Never", true, cg) ;30 Checkbox cg2 = new Checkbox("Sometimes",false,cg) ;31 Checkbox cg3 = new Checkbox("Often", false,cg) ;32 Scrollbar sc = new Scrollbar(Scrollbar.HORIZONTAL, 50, 10, 0, 100+10 ) ;33 DrawingCanvas myCanvas = new DrawingCanvas(300,225) ;3435 public void init() {36 int i ;37 for( i=0 ; i<colorNames.length ; i++ )38 ch.addItem(colorNames[i]) ;39 ch.select(colorNames[colorIndex]) ;40 add(new Label("TextField:",Label.RIGHT)) ; add(tf) ;41 add(new Label("BackGround:",Label.RIGHT)) ; add(ch) ;42 add(bt) ;43 add(cb1) ; add(cb2) ; add(cb3) ; add(cb4) ; add(cb5) ;44 add(cg1) ; add(cg2) ; add(cg3) ;45 add(sc) ;46 add(ta) ;47 add(myCanvas) ;48

Page 61: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

6.1. 第1日で使用するプログラム 61

49 tf.addActionListener(this) ;50 bt.addActionListener(this) ;51 ch.addItemListener(this) ;52 cb1.addItemListener(this) ;53 cb2.addItemListener(this) ;54 cb3.addItemListener(this) ;55 cb4.addItemListener(this) ;56 cb5.addItemListener(this) ;57 sc.addAdjustmentListener(this) ;58 addMouseListener(this) ;59 }6061 public void paint(Graphics g) {62 int w, h, c ;63 w = getSize().width ;64 h = getSize().height ;65 g.setColor(colorObj[colorIndex]) ;66 g.fillRect(0,0,w,h) ;67 }6869 // ActionListener70 public void actionPerformed(ActionEvent e) {71 if( e.getSource() == tf ) {72 ta.append("Caught: TextField\n") ;73 }74 else if( e.getSource() == bt ) {75 tf.setText("") ;76 colorIndex=0 ;77 ch.select(colorIndex) ;78 cb1.setState(false) ; cb2.setState(false) ; cb3.setState(false) ;79 cb4.setState(false) ; cb5.setState(false) ;80 cg1.setState(true) ;81 sc.setValue(50) ;82 ta.append("Caught: Button\n") ;83 repaint() ;84 }85 }8687 // ItemListener88 public void itemStateChanged(ItemEvent e) {89 if( e.getSource() == ch ) {90 ta.append("Caught: Choice\n") ;91 colorIndex = ch.getSelectedIndex() ;92 repaint() ;93 }94 else if( e.getSource() instanceof Checkbox ) {95 ta.append("Caught: Checkbox ["+96 (cb1.getState() ? "ON ":"OFF ")+97 (cb2.getState() ? "ON ":"OFF ")+98 (cb3.getState() ? "ON ":"OFF ")+

Page 62: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

62 第 6章 プログラム例

99 (cb4.getState() ? "ON ":"OFF ")+100 (cb5.getState() ? "ON ":"OFF ")+"]\n") ;101 }102 }103104 // AdjustmentListener105 public void adjustmentValueChanged(AdjustmentEvent e) {106 if( e.getSource() == sc ) {107 ta.append("Caught: Scrollbar v="+sc.getValue()+"\n") ;108 }109 }110111 // MouseListener (使用しないものでも定義は必要)112 public void mouseEntered(MouseEvent e) {}113 public void mouseExited(MouseEvent e) {}114 public void mousePressed(MouseEvent e) {}115 public void mouseReleased(MouseEvent e) {}116 public void mouseClicked(MouseEvent e) {117 ta.append("Clicked at ("+e.getX()+","+e.getY()+")\n") ;118 }119 }120121 // Canvas から派生させたクラス(publicにはしない)122 // -- ひとつのファイルには public のクラスはひとつしか持てない123 class DrawingCanvas extends Canvas124 implements MouseListener, MouseMotionListener {125 public int initX=-1, initY=-1, lastX=-1, lastY=-1 ;126127 public DrawingCanvas(int w, int h) {128 setSize(w,h) ;129 addMouseListener(this) ;130 addMouseMotionListener(this) ;131 }132133 public void update(Graphics g) {134 paint(g) ;135 }136 public void paint(Graphics g) {137 g.drawLine( initX, initY, lastX, lastY ) ;138 initX = lastX ; initY = lastY ;139 }140141 // MouseListener142 public void mousePressed(MouseEvent e) {143 initX = e.getX() ; initY = e.getY() ;144 }145 public void mouseReleased(MouseEvent e) {}146 public void mouseClicked(MouseEvent e) {}147 public void mouseEntered(MouseEvent e) {}148 public void mouseExited(MouseEvent e) {}

Page 63: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

6.1. 第1日で使用するプログラム 63

149 // MouseMotionListener150 public void mouseMoved(MouseEvent e) {}151 public void mouseDragged(MouseEvent e) {152 lastX = e.getX() ; lastY = e.getY() ;153 repaint() ;154 }155 }

Page 64: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

64 第 6章 プログラム例

6.1.4 プログラム例(sample04.java)

1 // GUIを使ったデータの入出力2 import java.applet.* ;3 import java.awt.* ;4 import java.awt.event.* ;56 public class sample04 extends Applet7 implements ActionListener {8 //9 Button b1 = new Button("計算実行") ;

10 TextField t1 = new TextField(5) ;11 TextField t2 = new TextField(5) ;12 TextArea t3 = new TextArea(2,50) ;1314 public void init() {15 add(new Label("体重 [kg]:",Label.RIGHT)) ; add(t1) ;16 add(new Label("身長 [cm]:",Label.RIGHT)) ; add(t2) ;17 add(b1) ; add(t3) ;18 b1.addActionListener(this) ;19 }2021 public void actionPerformed(ActionEvent e) {22 if( e.getSource() == b1 ) {23 float taijuu, sincho, himando ;24 String s ;25 s = t1.getText() ; taijuu = Float.valueOf(s).floatValue() ;26 s = t2.getText() ; sincho = Float.valueOf(s).floatValue() ;27 if( sincho > 0 && taijuu > 0 ) {28 himando = taijuu*1.0e7f/(sincho*sincho*sincho) ;29 s = "あなたの肥満度 (ローレル指数)は"+himando+"です\n" ;30 if( himando < 100 ) {31 t3.setText(s+"判定:ちょっと痩せ気味でっせ") ;32 }33 else if( himando > 140 ) {34 t3.setText(s+"判定:ちょっとダイエットしまひょか") ;35 }36 else {37 t3.setText(s+"判定:特にありまへん") ;38 }39 }40 else {41 t3.setText( "" ) ;42 }43 }44 }4546 }

Page 65: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

6.1. 第1日で使用するプログラム 65

6.1.5 プログラム例(sample05.java)

1 import java.applet.* ;2 import java.awt.* ;3 import java.awt.event.* ;45 public class sample05 extends Applet6 implements ActionListener,7 ItemListener,8 MouseListener {9

10 int shapeID = 0 ; // 0:Circle 1:Square 2:Cross11 int colorID = 0 ;12 Color[] colorTable = {Color.black,Color.red,Color.green,Color.blue} ;13 Button clearButton = new Button("Clear") ;14 Choice shapeChoice = new Choice() ;15 Choice colorChoice = new Choice() ;16 String[] itemShape = {"Circle","Square","Cross"} ;17 String[] itemColor = {"Black", "Red", "Green", "Blue"} ;18 int lastX=-1, lastY=-1 ;19 boolean clearFlag = true ;2021 public void init() {22 int i ;23 for( i=0 ; i<3 ; i++ ) {24 shapeChoice.addItem(itemShape[i]) ;25 }26 for( i=0 ; i<4 ; i++ ) {27 colorChoice.addItem(itemColor[i]) ;28 }29 add(clearButton) ; add(shapeChoice) ; add(colorChoice) ;30 clearButton.addActionListener(this) ;31 shapeChoice.addItemListener(this) ;32 colorChoice.addItemListener(this) ;33 addMouseListener(this) ;34 setBackground(Color.white) ;35 }3637 public void update(Graphics g) {38 paint(g) ;39 }40 public void paint(Graphics g) {41 if( clearFlag ) {42 g.setColor(Color.white) ;43 g.fillRect(0,0,getSize().width,getSize().height) ;44 g.setColor(Color.black) ;45 g.drawRect(0,0,getSize().width-1,getSize().height-1) ;46 clearFlag = false ;47 }48 else {

Page 66: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

66 第 6章 プログラム例

49 g.setColor(colorTable[colorID]) ;50 switch( shapeID ) {51 case 0: g.fillOval(lastX-3,lastY-3,7,7) ; break ;52 case 1: g.fillRect(lastX-3,lastY-3,7,7) ; break ;53 case 2: g.drawLine(lastX-3,lastY,lastX+3,lastY) ;54 g.drawLine(lastX,lastY-3,lastX,lastY+3) ; break ;55 }56 }57 }5859 public void actionPerformed(ActionEvent e) {60 if( e.getSource() == clearButton ) {61 clearFlag = true ; repaint() ;62 }63 }64 public void itemStateChanged(ItemEvent e) {65 if( e.getSource() == shapeChoice ) {66 shapeID = shapeChoice.getSelectedIndex() ;67 }68 else if( e.getSource() == colorChoice ) {69 colorID = colorChoice.getSelectedIndex() ;70 }71 }72 public void mousePressed(MouseEvent e) {}73 public void mouseReleased(MouseEvent e) {}74 public void mouseEntered(MouseEvent e) {}75 public void mouseExited(MouseEvent e) {}76 public void mouseClicked(MouseEvent e) {77 lastX = e.getX() ; lastY = e.getY() ;78 repaint() ;79 }80 }

Page 67: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

6.1. 第1日で使用するプログラム 67

6.1.6 プログラム例(sample06.java)

1 // 円軌道を運動するボールの軌跡2 import java.applet.* ;3 import java.awt.* ;45 public class sample06 extends Applet {67 public void paint(Graphics g) {8 int t ; // 角度 (deg.)9 double hankei = 150 ; // 軌道の半径

10 for( t=0 ; t<360 ; t+=10 ) {11 double a ;12 int x, y ;13 a = (double)t*Math.PI/180.0 ;14 x = (int)( hankei * Math.cos(a) ) ;15 y = (int)( hankei * Math.sin(a) ) ;16 g.setColor(Color.blue) ;17 g.fillOval( x+200-10, -y+200-10, 21, 21 ) ;18 }19 }20 }

Page 68: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

68 第 6章 プログラム例

6.2 第2日で使用するプログラム

6.2.1 プログラム例(sample07.java)

1 // 円軌道を運動するボールの軌跡2 import java.applet.* ;3 import java.awt.* ;45 public class sample07 extends Applet implements Runnable {6 int t = 0 ; // 角度 (deg.)7 double hankei = 150 ; // 軌道の半径8 Thread th = null ;9

10 public void start() {11 th = new Thread(this) ;12 th.start() ;13 }1415 public void run() {16 while( th != null ) {17 repaint() ;18 t = (t+5)%360 ;19 try {20 th.sleep(10) ; // 10ms = 0.01秒停止21 }22 catch (InterruptedException e) {23 }24 }25 }2627 public void paint(Graphics g) {28 double a ;29 int x, y ;30 g.setColor(Color.white) ;31 g.fillRect(10,10,380,380) ;32 a = (double)t*Math.PI/180.0 ;33 x = (int)( hankei * Math.cos(a) ) ;34 y = (int)( hankei * Math.sin(a) ) ;35 g.setColor(Color.blue) ;36 g.fillOval( x+200-10, -y+200-10, 21, 21 ) ;37 }38 }

Page 69: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

6.2. 第2日で使用するプログラム 69

6.2.2 プログラム例(sample08.java)

1 // ファイルからデータを読んで棒グラフを作成2 import java.applet.* ;3 import java.awt.* ;4 import java.io.* ;5 import java.net.* ;67 public class sample08 extends Applet {8 public void paint(Graphics g) {9 BufferedReader infile ;

10 String dataTitle ;11 String itemLabel ;12 String s ;13 int x, h, k ;14 Color[] ctbl = {15 Color.blue,Color.red,Color.green,Color.magenta,Color.pink16 } ;17 try {18 URL url = new URL(getDocumentBase(), "hist.txt") ;19 InputStream fis = url.openStream() ;20 // ローカルファイルの場合は上2行の代わりに次の形式でもよい21 // InputStream fis = new FileInputStream("hist.txt") ;22 infile = new BufferedReader(new InputStreamReader(fis)) ;23 dataTitle = infile.readLine() ; // 1行目はタイトル24 g.drawString(dataTitle,0,15) ;25 h = 0 ;26 while( (s = infile.readLine()) != null ) {27 s.trim() ; // 前後の空白を取り除く28 k = s.indexOf(" ") ;29 if( k >= 0 ) {30 h++ ;31 g.setColor( ctbl[h%5] ) ;32 itemLabel = s.substring(0,k) ;33 g.drawString(itemLabel,140-k*12,15+h*20) ;34 x = Integer.parseInt(s.substring(k+1)) ;35 g.fillRect(150,5+h*20,x*5,10) ;36 }37 }38 infile.close() ;39 }40 catch( IOException e ) {41 }42 }43 }

Page 70: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し
Page 71: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

71

第7章 演習問題

7.1 補足のための演習問題

7.1.1 Javaのプログラム例の検索

授業用のサンプル以外にも,インターネット上には Javaのプログラム例が紹介されています。

• 開発元の Sun Microsystems が提供しているデモプログラムについて実行してみなさい(授業のホームページからもリンクを貼っています)。

• Web検索を使って,Javaプログラムが公開されているサイトを見つけて,実行してみなさい。

• ソースが公開されていれば,ダウンロードして内容を検討し,気の付いた点を自由にメモしてみなさい。

7.1.2 グラフィクスの応用

オーバーライトして使うメソッド(paintや initなど)以外にも,ユーザが自由にメソッドを定義できます。スタイルは,

public class プログラム名 extends Applet {型名 ユーザ定義のメソッド名 ( 引数の並び ) {メソッドの記述...

}void paint(Graphics g) {...ユーザ定義のメソッド名 ( 実引数の並び ) ;...

}}

となります。

• 任意の大きさの正多角形を任意の位置に描くためのメソッドを設計しプログラム化してみなさい(図 7.1参照)。呼び出しのインタフェースは,以下のようにしてみること。

Page 72: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

72 第 7章 演習問題

void drawSeiTakakukei(Graphics g,int n,int cx,int cy,int r)g: 書き込む Graphicsオブジェクトn: 頂点の数

cx, cy: 外接円の中心座標r: 外接円の半径

• 同様に,星型を描くメソッドを設計して実装してみなさい。

正多角形に外接する円n = 3

(cx,cy)

r

図 7.1: 正多角形描画メソッドの設計のためのヒント

Page 73: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

第III部

Javaの文法(要約)

Page 74: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し
Page 75: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

75

第8章 基本文法

8.1 Javaプログラムの構造

8.1.1 クラス

クラスは1つのプログラム単位であるが,複数のクラスを用いて一連の計算を行うこともできる。既存クラスのメソッドや変数を引き継いだ新しいクラスを定義するにはクラス名の後に extends とし,既存クラス名を指定する。既存のクラスをスーパークラス,引き継いだクラスをサブクラスといい,このような方法を継承(inheritance)という。

8.1.2 インスタンス

他のクラスのメソッドを利用するには,そのクラスのオブジェクトを生成しておく必要がある。オブジェクト生成方法は,次の2とおりの方法がある。

クラス名 生成するオブジェクト名 = new クラス名 (【初期化用の引数】) ;または

クラス名 生成するオブジェクト名 ;オブジェクト名 = new クラス名 (【初期化用の引数】) ;

オブジェクトを生成するためのメソッドは,クラス名と同じ名前を持っており,クラス内の変数の初期化などに用いることができる。このメソッドはコンストラクタ(constructor)と呼ばれる。上記のように,コンストラクタは new とともに用いる。

8.1.3 メソッド

メソッドも1つのプログラム単位である。古典的な言語で,サブルーチン(Fortran など),プロシジャ(Pascal, PL/Iなど),関数(C言語)などと呼ばれるものと同等の単位と考えてよい。メソッドの定義は一般に次の形をとる。

【アクセス修飾子】 戻り値の型 メソッド名 (【引数の型 引数名【,…】】) {プログラム本体 ;return 【値】 ; // 戻り値の型が void の場合は値は不要

}

Page 76: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

76 第 8章 基本文法

引数の値がメソッド内の計算処理により変化する場合,この値が元の呼出し側の値に反映されて影響を及ぼすことはない。例えば,3 の値が代入されている引数 a がメソッドに渡され,メソッド内でこの値が 10 に変わったとしても,呼出し側での aの値は 3 のままである(値参照(reference by value)であるということ)。一方,引数が配列の場合は,アドレス参照(reference by address)となるので,メソッド内で配列要素の値を変更すると,呼び出し側での変更と同じ効果となる。アクセス修飾子は,どのクラスからでもアクセスを許すものは public,自己のクラスからのみアクセスできるものは private とする。当該クラスの親に相当するスーパークラスのメソッドを変更する場合は,同じ名前で引数や型が同じメソッドを定義することができる。これをメソッドのオーバーライトという。また,メソッド名が同じで引数の数・型の異なる複数のメソッドも定義できる。これをメソッドのオーバーロードという。

8.2 名前と型・数値

8.2.1 名前

名前は,形式的には,アルファベット1と数字2の列で表記された記号である。名前は,予約語や変数名,クラス名,メソッド名などに用いられる。

8.2.2 予約語

名前のうち,与えられた以外の意味に用いることができないもの。主な予約語を以下に列挙する(用途については省略)。

●主な予約語(この他にも存在する)abstract boolean break byte case cast catch char class const continuedefault do double else extends final finally float for future genericgoto if implements import inner instanceof int interface long nativenew null operator outer package private protected public rest returnshort static super switch synchronized this throw throws transienttry var void volatile while

8.2.3 基本の型

数値変数を使用する際は,その属性をコンパイラに対して指示しておく必要がある。属性とは,主に,その変数が保持するデータの形式であり,型と呼ぶ。Javaでは,基本の型として,表 8.1のようなものがあらかじめ用意されている。

1a~z,A~Z,例外的にアンダースコア とドルマーク$も含まれる。大文字・小文字も区別されるので注意20~9,ただし最初の文字としては使えない

Page 77: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

8.3. 演算 77

表 8.1: Javaにおける基本の型型 大きさ 型名 主な特徴・注意事項 定数の表記例論理 1ビット boolean 値 trueあるいは falseのみ true

文字 2バイト char Unicode文字セット (ASCIIではない) ’a’

整数 1バイト byte 範囲 -127~127 (byte)12

2バイト short 範囲 -32767~32767 (short)7456

4バイト int 標準の整数型 18358

8バイト long 約 19桁まで 75379638L

実数 4バイト float 有効数字は約 6桁 4.5F

8バイト double 標準の実数型 有効数字は約 15桁 1.236

8.3 演算

8.3.1 算術演算

いわゆる加減乗除を表現する(表 8.2)。

表 8.2: 算術演算用の記号記号 演算内容 式の例 式の値+ 加算 1+2 3- 減算 5-1 4* 乗算 2*3 6/ 除算 5/3 1 (整数どうしの場合は結果が切り捨てられる)% 剰余(あまり) 5%3 2 (整数どうしのみ)- 負数 -2 -2

8.3.2 関係演算

関係演算は,数値の大小を判定する演算である。判定結果は,式が成立する時は true ,式が成立しない時は false となる(表 8.3)。

8.3.3 論理演算

論理演算は,論理否定(NOT)/論理積(AND)/論理和(OR)の3種類である(表8.4)。通常は,関係演算式の論理的な結合に用いる。演算結果は,成立する時に true,成立しない場合は false となる。

Page 78: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

78 第 8章 基本文法

表 8.3: 関係演算用の記号記号 式の意味 式の例 式の値== 両辺が等しい 5==3 false

!= 両辺が等しくない 5!=3 true

< 左辺が小さい 5<3 false

> 右辺が小さい 5>3 true

<= 左辺≦右辺 5<=3 false

>= 左辺≧右辺 5>=3 true

表 8.4: 論理演算用の記号記号 式の意味 式の例 式の値! 論理否定。(単項)式を否定 ! (1==2) true

&& 論理積。両辺が同時に成立。 5<3 && 1<2 false

左辺が成立しない時は右辺は評価されない|| 論理和。両辺のどちらかが成立。 1<2 || 2<3 true

左辺が成立する時は右辺は評価されない

8.3.4 その他の演算用記号

演算の順序を明示したり,優先順位の順序を変更するには,1対の括弧 ()を用いる。多重になるような場合でも,同じ記号を用いることに注意しよう。

●括弧を用いた演算式の例(1+2)*3((4+6)/7)/8

その他にも C言語と同様の,3項演算と呼ばれる演算や,データのビット(2進数の各桁)ごとの論理演算を行なうビット演算もある。

8.4 変数とデータの型および代入演算

8.4.1 変数の表記方法

プログラムの中では,データは変数として表現される。変数の表記は,前述の名前のルールに従う。ある変数の型を指定するには,型名の後に変数を添える。複数の変数に対して,同一の型を指定するには,カンマで区切ればよい。暗黙の型宣言はないので,必ず宣言しておく。

Page 79: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

8.4. 変数とデータの型および代入演算 79

●変数の型宣言の例float takasa ;short a, b, c ;

実際のコーディングでは,このように文の区切りとしてのセミコロン ;を添える必要がある。セミコロンは必ずしも同一行にある必要はなく,また同一行に複数の宣言を書いてもよい。

8.4.2 代入演算

単純代入の他に,表 8.5 のようなものが用意されている。

表 8.5: Javaにおける代入演算記号 意味= 右辺の結果を単純に代入+= 右辺の結果を加えて代入-= 右辺の結果を減じて代入*= 右辺の結果を乗じて代入/= 右辺の結果で除して代入%= 右辺の結果による剰余を代入

また,C言語と同じく,変数に対しては,単項演算として機能するインクリメント(++)やデクリメント(--)も利用できる。

8.4.3 型変換

変数の型が違うものどうしの演算は,変換先の型が変換元の型より精度が高い場合は自動変換を行う。逆の場合は明示的な型変換が必要であり,変数名や式の前に型名を括弧で括って,(int), (float)などと指定する。型による変数の精度の順は byte < short < int < long < float < doubleである。例えば,

   int k ;k = (int)(5/2.0); // (5/2.0)の実数計算結果 2.5 が整数化され

// 2が kに代入される.

の場合,右辺の (int)がないとエラーになる。

Page 80: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

80 第 8章 基本文法

8.4.4 数値と文字列の変換

Javaのプログラムでは,外部とのデータのやりとりは文字列(文字の配列あるいはString

クラスのオブジェクト)で行なう。これらの文字列から数値データを取り出すには,表 8.6に示す変換方法をとる必要がある。

表 8.6: 文字列の数値への変換方法

変換先の型 変換方法int i = Integer.parseInt( 文字列 );

long l = Long.parseLong( 文字列 );

float f = Float.valueOf( 文字列 ).floatValue();

double d = Double.valueOf( 文字列 ).doubleValue();

一方,数値を表示するには,文字列に変換しておく必要がある。数値を文字列に変換するには,各型に対応したクラスに定義されている toString()メソッドを用いる。

表 8.7: 数値の文字列への変換方法

変換元の型 変換方法int s = Integer.toString( i );

long s = Long.toString( l );

float s = Float.toString( f );

double s = Double.toString( d );

8.5 文

8.5.1 単純文

宣言や式にセミコロン;を添えたもの。

8.5.2 複合文

複数の文の前後を「{」と「}」で括ったもの。ひとつの文と同等に扱われる。

Page 81: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

8.5. 文 81

8.5.3 条件文

予約語 ifを用いて,条件式(関係演算式やそれらを論理演算で結合したもの)によって,文の実行を制御できる。

●形式1if ( 条件式 ) {文; 【…】

}

例) if ( x < 0 ) {x = -x ;

}

●形式2if ( 条件式 ) {文 1; 【…】

}else {文 2; 【…】

}

例) if ( x < 0 ) {y = -x ;

}else {y = x ;

}

図式で表現すると,図 8.1のようになる。

8.5.4 switch~case

整数式の結果に応じて,3パターン以上の分岐処理を表現する。

●形式switch ( 整数式 ) {

case 定数 1 : 【 文の並び 1… 】【break;】case 定数 2 : 【 文の並び 2… 】【break;】

…case 定数 n : 【 文の並び n… 】【break;】【default: 【 文の並び … 】】

}

文の並びの最後が break 文でない場合には,そのまま直下の文の実行が行なわれることになるので注意すること。フローチャートで表現すると,図 8.2のようになる。

Page 82: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

82 第 8章 基本文法

ifによる条件分岐(その1) ifによる条件分岐(その2)

条件式

文(単純文または複合文)

条件式

文1(単純文または複合文)

True

False

文2(単純文または複合文)

FalseTrue

図 8.1: ifによる条件文の動作の流れ

8.5.5 for

一般の反復処理を表現する。

●形式for ( 式 1 ; 式 2 ; 式 3 ) {【文; … 】

}

forの直後に一対の括弧 ( )を添え,2つのセミコロン; によって,3つの部分に分ける。それぞれの内容は,次のとおり。

• 式 1は,反復の開始時に1度だけ実行される内容で,「初期化」とも呼ばれる。

• 式 2には,反復の条件を表現する。「継続条件」とも呼ばれる。

• 式 3には,2度目以降の反復処理に先立って実行される内容で,「再初期化」とも呼ばれる。

一般的には,適当な変数を制御用に用いて,ある一定の数だけを反復させるように表現する。例えば,1から 10までの整数を表示させるには,次のように表現する。

●使用例int x ;…for ( x=1 ; x<=10 ; x+=1 ) {System.out.println("X="+x) ;

}

Page 83: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

8.5. 文 83

文1(単純文または複合文)

True

整数式==定数1

True

整数式==定数2

False

文2(単純文または複合文)

文(単純文または複合文)

(default:がある場合)

break 文がない場合

break 文がない場合

break 文が実行された場合

False

break 文が実行された場合

図 8.2: switch~case構文のフローチャート表現

8.5.6 while

DO–WHILE 型の反復処理を表現する。

●形式while ( 論理式 ) {【文; …】

}

forに比べると,括弧内には(省略不可能な)継続条件を示す式のみを記述する点が異なる。whileの構文を一般的にフローチャートで示すと,図 8.4 のようになる。

●例while( th != null ) {

repaint() ;t += 5 ;…

}

8.5.7 do ~ while

REPEAT–UNTIL 型の反復処理を表現する。

Page 84: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

84 第 8章 基本文法

式1

式2

式3

文(単純文または複合文)

True

False

(次の文の処理へ)

図 8.3: for()構文のフローチャート表現

●形式do {【文; …】

} while ( 論理式 ) ;

forに比べると,括弧内には(省略不可能な)継続条件を示す式のみを記述する点が異なり,文は最低1回は実行された後,最初の継続条件の評価が行われる。do ~ whileの構文を一般的にフローチャートで示すと,図 8.5 のようになる。

●例do {…

} while( x>0 ) ;

8.5.8 breakと continue

反復処理の中で breakキーワードを用いると,最も近い反復処理が中断される。for・while・do ~ whileいずれにも使用できる3。入れ子状態で使用する時で外側の反復を中

3というよりは,中断命令は break1種類しかない

Page 85: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

8.5. 文 85

文(単純文または複合文)

True

False

(次の文の処理へ)

図 8.4: while構文のフローチャート表現

断したい場合には,ラベルを使うことができる。また,反復処理の中で continueキーワードを用いると,最も近い反復処理の先頭部分に戻って反復される。入れ子状態で使用する時で外側の反復をの先頭部に戻したい場合には,ラベルを使うことができる。

●ラベル付き breakの使用例soto: // ラベル定義

for( i=0 ; i<10 ; i++ ) {naka: // ラベル定義for( j=0 ; j<10 ; j++ ) {if( … ) {break soto ; // iのループを中断

}if( … ) {break ; // jのループを中断 break naka ; でも同じ

}}

}

8.5.9 配列

配列はその型宣言と領域の確保とを別個に行うことができる。

●型宣言int a[] ; // int[] a; とすることも可 (こちらが標準)

Page 86: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

86 第 8章 基本文法

文(単純文または複合文)

True

False

(次の文の処理へ)

図 8.5: do ~ while構文のフローチャート表現

double b[], c[], d[][];

●領域の確保int n = 90;d = new double [n][n]; // d = new double[90][90]; と直接書いてもよい

型宣言と領域確保を同時に行うことも可能である。

●領域の確保double b[] = new double[50]; // a[0] から a[49] まで 50個領域確保float c[] = {10.0f, 15.0f, 10.0f}; // 追加は不可

なお,C言語のように int x[5]; とは書けないので注意。2次元配列 int a[][] = { { 1, 2 }, { 3, 4 } } ; の要素の並び順は,

a[0][0] = 1, a[0][1] = 2, ・・・

である.代入をせずに確保された配列の各要素の初期値は 0 である。配列 a の領域の大きさは

a.length とすることにより知れる。

8.5.10 数学関数

sin, cosなどの数学関数は,クラス Math のメソッドとして定義されている。主要な数学関数を表 8.8にまとめておく。なお,円周率 π,自然対数の底 eは,それぞれ Math.PI,Math.E という定数として定義されて

いる。

Page 87: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

8.5. 文 87

表 8.8: 数学ライブラリの主なメソッド(クラス Math)種類 メソッド 引数の型 戻り値の型

絶対値 |a| Math.abs(a) int,long,float,double aと同じ正弦 sin Math.sin(a) double double

余弦 cos Math.cos(a) double double

正接 tan Math.tan(a) double double

逆正弦 sin−1 Math.asin(a) double double

逆余弦 cos−1 Math.acos(a) double double

逆正接 tan−1 Math.atan(a) double double

平方根 Math.sqrt(a) double double

冪乗 ab Math.pow(a,b) double double

指数 Math.exp(a) double double

自然対数 Math.log(a) double double

最大値 Math.max(a,b) int,long,float,double a,bと同じ最小値 Math.min(a,b) int,long,float,double a,bと同じ切り捨て Math.floor(a) double double

四捨五入 Math.rint(a) double double

切り上げ Math.ceil(a) double double

四捨五入後整数化 Math.round(a) double,float long,int

乱数 Math.random() なし double

Page 88: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し
Page 89: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

89

第9章 アプレットとグラフィクス

9.1 アプレットの基本形アプレットによるグラフィックス処理の基本形は下記のようになる。

import java.applet.* ;import java.awt.* ;

public class クラス名 extends Applet{【インスタンス変数の定義】public void init() {【アプレットロード時の初期化】

}public void paint( Graphics g ) {【グラフィクスの実行内容を指定】

}}

9.2 グラフィクス

線引きなどのグラフィクス機能はクラス Graphics で定義されている。したがって,描画は Graphicsオブジェクトに対して,次のようにメソッドを使用する。

Graphicsオブジェクト.メソッド (描画に必要な座標や大きさのパラメータ) ;

9.2.1 描画メソッド

主要なメソッド名と引数の概略は,以下のとおりである。

線分

• drawLine(int x1, int y1, int x2, int y2)このグラフィックスコンテキストの座標系の点 (x1, y1) と点 (x2, y2) との間に現在の色を使って線を描く。

• drawPolyline(int[] xPoints, int[] yPoints, int nPoints)x 座標と y 座標の配列で定義され連続的につながった直線を描く。

Page 90: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

90 第 9章 アプレットとグラフィクス

矩形

• drawRect(int x, int y, int width, int height)指定された矩形の輪郭を描画する。

• fillRect(int x, int y, int width, int height)指定された矩形を塗りつぶす。

• draw3DRect(int x, int y, int width, int height, boolean raised)指定された矩形の輪郭を 3D で強調表示して描画する。

• fill3DRect(int x, int y, int width, int height, boolean raised)現在の色で強調表示された 3 次元矩形を塗りつぶす。

• drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight)丸いコーナー付きの輪郭の矩形を,このグラフィックスコンテキストの現在の色を使用して描く。

• fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight)指定された丸いコーナー付きの矩形を現在の色で塗りつぶす。

円・楕円

• drawOval(int x, int y, int width, int height)楕円の輪郭を描く。

• fillOval(int x, int y, int width, int height)指定された矩形の中の楕円形を現在の色で塗りつぶす。

円弧・楕円弧

• drawArc(int x, int y, int width, int height, int startAngle, int arcAngle)指定された矩形をカバーする円弧または楕円弧の輪郭を描く。

• fillArc(int x, int y, int width, int height, int startAngle, int arcAngle)指定された矩形をカバーする円弧または楕円弧を塗りつぶす。

多角形

• drawPolygon(int[] xPoints, int[] yPoints, int nPoints)x 座標と y 座標の配列で定義された閉じた多角形を描く。

• fillPolygon(int[] xPoints, int[] yPoints, int nPoints)x 座標と y 座標の配列で定義される閉じた多角形を塗りつぶす。

Page 91: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

9.2. グラフィクス 91

文字列・その他

• drawString(String str, int x, int y)このグラフィックスコンテキストの現在のフォントと色を使い,指定された文字列によって指定されたテキストを描く。

• copyArea(int x, int y, int width, int height, int dx, int dy)コンポーネントの領域を,dx と dy で指定された距離でコピーする。

引数のより詳しい説明やその他の描画メソッドの説明については,Sun Microsystemsのオンライン文書(http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/index.html)の Graphicsクラスの説明を参照のこと。

9.2.2 色の指定

さて,前項で紹介した描画メソッドを用いると,一通りの形を描くことができるが,このままでは色彩は黒のままで描かれてしまう。そこで,色の指定方法につい説明しておく。

Javaでは,描画メソッドの引数に色彩の指定がないことからも分かるように,描画メソッド単位ではなく,描画メソッドを使用する前にあらかじめ色の指定を行なう1。色の指定そのものは,Colorというクラスによって行なう。Colorクラスでは,光の三原色RGBの値を個別に指定して制御するようになっている。具体的には,Colorクラスの変数を定義し,この変数に対して,好みの色を設定しておく。具体的には,次のようにする。

Color c ;c = new Color(255,0,0) ; // (R=255,G=0,B=0)なので赤色

次のように書いてもよい。

Color c = new Color(255,0,0) ; // (R=255,G=0,B=0)なので赤色

ポイントは,new Color(赤の強さ,緑の強さ,青の強さ)の部分である。光の強さを,三原色それぞれに 0~255の数値 (つまりそれぞれ 8ビットの範囲)で指定する。続いて,描画メソッドを使用する前に,setColorメソッドを用いて,色の指定を行なう。上記の例のように,変数—c—に赤色が設定されていれば,

g.setColor( c ) ;g.fillOval(10,10,100,100) ; // 赤い円

とすることで,赤の塗りつぶした円が描かれるという具合である。なお,基本的な色に関しては,Colorクラスに定義済みのものを使用することもできる(表 9.1)。

1不便なようにも思えるが,Javaに限らず,グラフィクスの世界では,色と形状を別々に指定する方式は一般的である

Page 92: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

92 第 9章 アプレットとグラフィクス

表 9.1: 定義済みの色(クラス Color)

色定数 色Color.black 黒Color.blue 青Color.cyan シアン(青緑色)

Color.darkGray 濃い灰色Color.gray 灰色Color.green 緑

Color.lightGray 淡い灰色Color.magenta マゼンタ(赤紫色)Color.orange オレンジColor.pink ピンクColor.red 赤Color.white 白Color.yellow 黄

Page 93: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

93

第10章 GUI

10.1 GUI部品

TextField

テキストフィールドは,文字列データの入出力に用います。実数・小数のような区別はないので,あらかじめ文字列の状態に変換したり,文字列として取り出したデータを必要な型のデータに変換して使用する必要があります。

●変数としての宣言TextField tf1 ; // tf1 と名付けたテキストフィールド

●部品の割り当て(画面には表示されない)tf1 = new TextField(5) ; // 5文字分の幅を持つテキストフィールド

●画面への配置add(tf1) ; // 特定のオブジェクト上の場合は object.add(tf1)

変数はクラス内の共通変数(インスタンス変数)としておくのが通例で,割当と画面への配置は,通常 init()内で行います。実際のデータのやりとりは,以下のように行うことになります。

●文字列データの取り出しString s ;s = tf1.getText() ;

●整数データの取り出しint i ;i = Integer.parseInt(tf1.getText()) ;

●実数データの取り出しfloat f ;f = Float.valueOf(tf1.getText()).floatValue ;

●文字列データの表示tf1.setText(s) ;

●整数データの表示tf1.setText(Integer.toString(i)) ;

●実数データの表示tf1.setText(Float.toString(f)) ;

●混在メッセージの表示tf1.setText("あなたの肥満度は"+himando+"です") ;

混在メッセージでの例は,文字列との加算の場合は数値データの型に応じて toString()

が行われた後に連結される,という性質を利用しています。この他,表示専用にするかしないかの設定を,

Page 94: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

94 第 10章 GUI

●表示専用にするtf1.setEditable(flase) ;

●書き換え可能に戻すtf1.setEditable(true) ;

として,入出力の目的に応じてコントロールできます。

TextArea

テキストエリアは,文字列データの(主に)出力に用いる。テキストフィールドと同様に,実数・小数のような区別はないので,あらかじめ文字列に変換して使用するのはテキストフィールドと同様です。また,テキストフィールドと異なり,複数行利用できます。

●変数としての宣言TextArea ta1 ; // ta1 と名付けたテキストエリア

●部品の割り当て(画面には表示されない)ta1 = new TextArea(5,20) ; // 5行× 20文字分の幅を持つテキストエリア

●画面への配置add(ta1) ; // 特定のオブジェクト上の場合は object.add(ta1)

変数はクラス内の共通変数(インスタンス変数)としておくのが通例で,割当と画面への配置は,通常 init()内で行います。実際のデータのやりとりは,以下のように行うことになります。

●文字列データの表示ta1.append(s) ;

●整数データの表示ta1.append(Integer.toString(i)) ;

●実数データの表示ta1.append(Float.toString(f)) ;

●混在メッセージの表示ta1.append("あなたの肥満度は"+himando+"です\n") ;

混在メッセージでの例は,文字列との加算の場合は,数値データの型に応じて toString()

が行われた後連結される,という性質を利用しています。また,改行を示す\nも C言語の場合と同様に機能します。

Label

ラベルは,表示専用の文字列フィールドと考えればよいでしょう。一度設定すると,その内容をプログラム内で変更したり参照したりすることはほとんどないので,通常以下のような使い方になります。

●部品の割り当てと画面への配置add(new Label("体重")) ; // 表示のみなので通常はこのような使い方

Page 95: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

10.1. GUI部品 95

Button

ボタンは,文字通り,クリック可能なボタンを構成します。ただし,クリックした際の動作(イベント)を指示するための特別なメソッドを準備しておく必要があります。

●変数としての宣言Button bt1 ; // bt1 と名付けたボタン

●部品の割り当て(画面には表示されない)bt1 = new Button("Start") ; // Startというラベルを持つボタン

●画面への配置add(bt1) ; // 特定のオブジェクト上の場合は object.add(bt1)

●リスナ (クリックしたこと-イベント-を検知して処理するメソッド)の登録bt1.addActionListener(this) ;

変数はクラス内の共通変数としておくのが通例で,割当と画面への配置およびリスナの登録は,通常 init()内で行います。ボタンなど,ユーザからのアクションを処理する部品を使用する場合は,イベント処理を行う都合でプログラムの先頭に import java.awt.event.*;を指示しておきます。さらに,class宣言時に implementsキーワードを用いて,ActionListenerを指示しておく必要があります。他のクラスがすでに implementsで指示されている場合は,カンマで区切って続けます。

● classでの宣言public class myApplet extends Applet implements ActionListener {

...}あるいはpublic class myApplet extends Applet

implements Runnable, ActionListener {...

}など

リスナは,actionPerformedメソッドを定義してそこに記述することになります。

public class myApplet extends Applet implements ActionListener {...public void actionPerformed(ActionEvent ev) {if( ev.getSource() == bt1 ) { // 特定のボタンが押されたか?... 対応する動作の記述 ...

}}...

}

Choice

チョイスは,与えられた選択肢から,ひとつの値を指示するのに用います。

Page 96: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

96 第 10章 GUI

●変数としての宣言Choice ch1 ; // ch1 と名付けたチョイス

●部品の割り当て(画面には表示されない)ch1 = new Choice() ; // 新しいチョイスを作成

●選択肢の追加ch1.addItem("List 1") ; // 選択肢ごとに追加ch1.addItem("List 2") ; // 新しいバージョンでは add() を使用

●画面への配置add(ch1) ; // 特定のオブジェクト上の場合は object.add(ch1)

●リスナ (選択肢が変更されたこと-イベント-を検知して処理するメソッド)の登録ch1.addItemListener(this) ;

変数はクラス内の共通変数としておくのが通例で,割当と画面への配置およびリスナの登録は,通常 init()内で行います。実際のデータのやりとりは,以下のように行うことになります。

●プログラム側からの指示で項目番号(先頭は 0)を指定ch1.select(1) ; // 2番目の項目に設定

●選択されている項目番号(先頭は 0)を求めるint idx ;idx = ch1.getSelectedIndex() ;

●選択されている項目を文字列のまま取り出すString selectedItem ;selectedItem = ch1.getSelectedItem() ;

リスナを用いた処理を行う場合は,class宣言時に implementsキーワードを用いて,ItemListenerを指示しておく必要があります。他のクラスがすでに implementsで指示されている場合は,カンマで区切って続けます。

● classでの宣言public class myApplet extends Applet implements ItemListener {...

}あるいはpublic class myApplet extends Applet

implements Runnable, ItemListener {...

}など

リスナは,itemStateChangedメソッドを定義してそこに記述することになります。

public class myApplet extends Applet implements ItemListener {...public void itemStateChanged(ItemEvent ev) {if( ev.getSource() == ch1 ) { // 特定のチョイスが変更されたか?... 対応する動作の記述 ...

}}...

}

Page 97: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

10.1. GUI部品 97

Checkbox

チェックボックスは,項目の選択/非選択の状態を取り出すために用いられます。

●変数としての宣言Checkbox cb1 ; // cb1 と名付けたチェックボックス

●部品の割り当て(画面には表示されない)cb1 = new Checkbox("I am a Japanese.") ; // 新しいチェックボックスを作成

●画面への配置add(cb1) ; // 特定のオブジェクト上の場合は object.add(cb1)

●リスナ (選択状態が変更されたこと-イベント-を検知して処理するメソッド)の登録cb1.addItemListener(this) ;

実際のデータのやりとりは,以下のように行うことになります。

●プログラム側からの指示で選択状態を指定cb1.setState(true) ; // 選択された状態に設定cb1.setState(false) ; // 非選択の状態に設定

●選択状態の判定if( cb1.getState() ) {

...選択されている時...}else {

...選択されていない時...}

リスナを用いた処理を行う場合は,class宣言時に implementsキーワードを用いて,ItemListenerを指示しておく必要があります。他のクラスがすでに implementsで指示されている場合は,カンマで区切って続けます。

● classでの宣言public class myApplet extends Applet implements ItemListener {

...}あるいはpublic class myApplet extends Applet

implements Runnable, ItemListener {...

}など

リスナは,itemStateChangedメソッドを定義してそこに記述することになります。

public class myApplet extends Applet implements ItemListener {...public void itemStateChanged(ItemEvent ev) {if( ev.getSource() == cb1 ) { // 特定のチェックボックスが変更されたか?... 対応する動作の記述 ...

}}...

}

Page 98: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

98 第 10章 GUI

Scrollbar

スクロールバーは,数値をスライダー形式で設定するのに用いられます。

●変数としての宣言Scrollbar sc1 ; // sc1 と名付けたスクロールバー

●部品の割り当て(画面には表示されない)// 最小値 0, 最大値 100 (=110-10), で幅 10の水平スクロールバーを生成し初期値を 50

に設定// 垂直バーの場合は Scrollbar.VERTIAL を指定sc1 = new Scrollbar(Scrollbar.HORIZONTAL, 50, 10, 0, 110) ;

●画面への配置add(sc1) ; // 特定のオブジェクト上の場合は object.add(sc1)

●リスナ (選択状態が変更されたこと-イベント-を検知して処理するメソッド)の登録sc1.addAdjustmentListener(this) ;

実際のデータのやりとりは,以下のように行うことになります。

●プログラム側からの指示で値を指示sc1.setValue(75) ; // 75に設定

●値の取り出しint v ;v = sc1.getValue() ;

リスナを用いた処理を行う場合は,class宣言時に implementsキーワードを用いて,AdjustmentListenerを指示しておく必要があります。他のクラスがすでに implementsで指示されている場合は,カンマで区切って続けます。

● classでの宣言public class myApplet extends Applet implements AdjustmentListener {...

}あるいはpublic class myApplet extends Applet

implements Runnable, AdjustmentListener {...

}など

リスナは,adjustmentValueChangedメソッドを定義してそこに記述することになります。

public class myApplet extends Applet implements AdjustmentListener {...public void adjustmentValueChanged(AdjustmentEvent ev) {if( ev.getSource() == sc1 ) { // 特定のスクロールバーが変更されたか?... 対応する動作の記述 ...

}}...

}

Page 99: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

10.2. レイアウト 99

10.2 レイアウト

レイアウトマネージャには,デフォルトで横 1行に並べる FlowLayout,部品を左右・上下・中央に配置する BorderLayout,部品をタイル状に表の中に配置する GridLayout

などがあります1。デフォルトでは,FlowLayoutが用いられますが,これ以外の配置にしたい時は,setLayoutメソッドを用います。

10.2.1 BorderLayout

setLayoutで BorderLayoutオブジェクトを指定した後,addの第2引数に配置する場所を指定して部品を配置します。

●レイアウトの変更setLayout(new BorderLayout()) ; // ボーダーレイアウト

●部品の配置add( GUIオブジェクト, BorderLayout.NORTH) ; // 上add( GUIオブジェクト, BorderLayout.SOUTH) ; // 下add( GUIオブジェクト, BorderLayout.WEST) ; // 左add( GUIオブジェクト, BorderLayout.EAST) ; // 右add( GUIオブジェクト, BorderLayout.CENTER) ; // 中央

10.2.2 GridLayout

setLayoutで GridLayoutオブジェクトを指定した後,addで部品を配置します。

●レイアウトの変更setLayout(new GridLayout(3,2)) ; // 3行 2列のグリッドレイアウト

●部品の配置add( GUIオブジェクト ) ; // 左上add( GUIオブジェクト ) ; // 右上add( GUIオブジェクト ) ; // 中央左add( GUIオブジェクト ) ; // 中央右add( GUIオブジェクト ) ; // 左下add( GUIオブジェクト ) ; // 右下

1使い方はやや繁雑になりますが,より自由度の高い配置を行える GridBagLayout や,カードをめくるように配置する CardLayout も使用できます。

Page 100: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し
Page 101: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

101

付 録A 参考書の紹介

Javaに関する文献は,コンピュータ専門コーナーを備えている程度の書店であれば,選択に困るほど豊富に存在します。ネットで検索すると,書名に Javaを含むものだけで 600程度存在するようです(もっとも,Java島のガイドブックだったりすることもあるので,実数はこれより少ないかも知れません)。

A.1 Java学習のための参考書

Java誕生間もない頃の入門書としては,文献 [8] [1] [9]などがあります。このテキストを作成する段階でも参考にはしましたが,Javaの規格が古い時代のものであり,これから学習する人には無用でしょう(現在では入手自体が困難ということもありますが)。文献 [6]は,全体の半分近くを SDKのインストール手順やプログラムの作成・実行手順の説明に割かれており,プログラミングの初級者にもお薦めできます。後半は,画像処理技法の説明に重点が置かれ,Javaの文法・理論の説明は最小限となっています。全体に平易な文章で書かれているので,最初に取り組む本としては損はない一冊でしょう。文献 [11]は,機能や話題別にコンパクトに整理されているので,辞書的な使い方に向いた一冊と言えます。文法的な説明も難しくなり過ぎない程度には詳しいので,他の言語を熟知している人が Javaに乗り換えるためには適当な一冊と思われます。なお,SDKを収めた CD-ROMが付いています。文献 [12]は,Javaの教科書と言うよりは,2次元 CG・3次元 CGの投影法など理論面が重視された本と言えます。理工系の学生を念頭に書かれているためか行列・ベクトルの知識を前提に説明されているので,数学が苦手という方には敷居が高いかも知れません。著者のWebページ(http://www.human.nagoya-u.ac.jp/~mine/simu.html)では,例題のデモやソース・要約版の資料も公開されており,これだけでも重宝します。技術的な情報や最新の情報については,開発元である Sun Microsystems社の Java関連ページ [5]を参照するのが一番確実でしょう。ただし,リンクが入り組んでいるので,日常的に利用するならブックマーク(お気に入り)を活用して,自分なりに整理しておく必要があるかも知れません。文献 [10]は,テクニカルライターとして定評のある林晴比古氏の入門者向けの参考書です。時間をかけてもよいから基礎からじっくりと学習するには最適の本と言っていいでしょう。なお,JDKの新しい版に合わせた改訂版が 2004年に出版されていますので,実際に購入する場合はそちらがお薦めです。シニア編と合わせて通読すれば相当の実力がつ

Page 102: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

102 付 録A 参考書の紹介

くことでしょう。

Page 103: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

A.2. 発展的学習のための参考書 103

A.2 発展的学習のための参考書

文献 [3]は,UNIXやC言語の開発スタッフらによるものですが,原題が Software Toolsとなっていることから分かるように内容は,UNIXにおけるソフトウェア開発の流儀を示す教則本となっています。C言語すら一般にはまだ普及していない頃の著作であるため,プログラムはRatfor(Fortranに似た構造化言語—現在の Fortran90相当—)で表記されていますが,アルゴリズムの設計手順や概念を学ぶには,一読しておいて損はない本と言えるでしょう。文献 [4]は,プログラムの推敲方法に重点を置いたもので,当時主流であった Fortran

と PL/Iを題材にしてはいますが,チームでの開発を想定した「美しい」書き方,インデントの付け方,注釈の付け方など実践的な内容が盛り込まれています。

Kernighanの最近の著書 [2]は,文献 [3] [4]の性格を時代に合わせて受け継いだプログラム設計の指南書ということができます。Javaへの言及もありますので,上級者はぜひ手元に置きたい一冊です。

C++は,オブジェクト指向プログラミング言語の先輩格にあたるもので,Javaの言語仕様にも大きな影響を与えているといってもよいでしょう。オブジェクト指向プログラミングの学習が目的であれば,設計者自らの手による文献 [7]にあたるのもよいかも知れません。文献 [13]は,IDE(Integrated Development Environment)として注目されているEclipseの解説本です。Eclipseは,http://www.eclipse.org/から無償でダウンロードでき,プロにも愛好者が多いようです。開発環境の使い方をマスターするには必読でしょう。

Page 104: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し
Page 105: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

105

関連図書

[1] Jerry R. Jackson, Alan L. McClellan:神林靖・訳. 例題で学ぶ Java. アスキー,1997.

[2] Brian W. Kernighan, Rob Pike:福崎俊博・訳. プログラミング作法:原題 ThePractice of Programming. アスキー, 2000(原書 1999).

[3] Brian W. Kernighan, P. J. Plauger:木村泉・訳. ソフトウェア作法 (さくほう):原題 SoftwareTools. 共立出版, 1981(原書 1976).

[4] Brian W. Kernighan, P. J. Plauger:木村泉・訳. プログラム書法[第2版]:原題 The Elements of Programming Style. 共立出版, 1982(原書 1978).

[5] Sun Microsystems. Java 2 Platform, Standard Edition (J2SE). Webページ(http://java.sun.com/j2se/1.5.0/ja/docs/ja/), 2004.

[6] 杉山三樹雄. 楽しく学ぶ Javaではじめる画像処理プログラミング. ディー・アート,2002.

[7] Bjarne Stroustrup:齋藤信男他・訳. プログラミング言語 C++ 第2版:The C++Programming Language. トッパン, 1993(原書 1991).

[8] 武田圭史. Java使いへの道. ソフトバンク, 1996.

[9] 戸川隼人. ザ・Java. サイエンス社, 1998.

[10] 林晴比古. 新 Java言語入門 — ビギナー編 —, Java言語実用マスターシリーズ, 第 1巻. ソフトバンクパブリッシング, 2001.

[11] 福島靖浩. Javaパーフェクトマスター. 秀和システム, 2003.

[12] 峯村吉泰. Javaによるコンピュータグラフィックス — 基礎からシミュレーションの可

視化まで. 森北出版, 2003.

[13] 宮本信二. Eclipse 3完全攻略. ソフトバンクパブリッシング, 2004.

Page 106: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

106

索 引

<applet>~</applet>, 58AWT, 33ActionEvent, 35ActionListener, 35AdjustmentEvent, 35AdjustmentListener, 35BorderLayout, 99BufferedReader, 47Button, 35, 95C++, 103Checkbox, 35, 97Choice, 35, 95–96Color, 38, 91~定数, 91

Eclipse, 103E, 86Fortran, 103Frame, 52GridLayout, 99Image, 48InputStream, 47ItemEvent, 35ItemListener, 35LOGO, 18Label, 94MouseListner, 37MouseMotionListener, 37PI, 86PL/I, 103RatFor, 103Scrollbar, 35, 98Smalltalk, 18

Swing, 33TextArea, 35, 94TextField, 35, 93–94Thread, 43acos, 86actionPerformed, 35addActionListener, 35addAdjustmentListener, 35addItemListener, 35addMouseListener, 37addMouseMotionListener, 37add, 34adjustmentValueChanged, 35appletviewer, 23asin, 86atan, 86ceil, 86copyArea, 91cos, 86do~while, 31, 84draw3DRect, 90drawArc, 90drawImage, 48drawLine, 89drawOval, 90drawPolyLine, 89drawPolygon, 90drawRect, 90drawRoundRect, 90drawString, 91exp, 86fill3DRect, 90

Page 107: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

索 引 107

fillArc, 90fillOval, 90fillPolygon, 90fillRect, 38, 90fillRoundRect, 90floor, 86for, 31, 82getImage, 48getSize, 38if~else~, 31, 81if~, 81init, 34itemStateChanged, 35javac, 23java, 23length, 86log, 86main, 51max, 86min, 86mouseClicked, 37mouseDragged, 37mouseEnetered, 37mouseExited, 37mouseMoved, 37mousePressed, 37mouseReleased, 37new, 34, 75paint, 34, 38, 44pow, 86random, 86repaint, 38rint, 86round, 86sample01.html, 24, 28, 58sample01.java, 24, 28, 57sample02.java, 31, 59sample03.java, 33, 35, 60sample04.java, 37, 64

sample05.java, 39, 65sample06.java, 67sample07.java, 68sample08.java, 69setColor, 38setLabel, 46setLayout, 99sin, 86sleep, 43sqrt, 86switch~case~, 81tan, 86try~catch~, 48update, 44while, 31, 83

API, 16

GUI, 18, 33~部品, 93

GUIを備えたプログラムの基本形, 35

IDE, 103

JDK, 23

UNIX, 103

Virtual Machine, 25VM, 25

アニメーション表現の原理, 41アプリケーション, 23アプリケーションの基本形, 51アプレット, 23アプレットの基本形, 89アプレットビューア, 23イベント, 17

GUI部品に関連づけられた~, 35~駆動型, 17マウスに関連づけられた~, 37

Page 108: プログラミング実習(Java)sakkun.cc.yokohama-cu.ac.jp/~sakkun/uoa/program_j/progj-text.pdf · 1.1 構造化プログラミングとオブジェクト指向言語 解説 受講者の皆さんは,すでにプログラミングの体験者であることを想定し

108 索 引

インスタンス, 75オーバーライト, 34, 44, 76オーバーロード, 76オブジェクト, 18

GUI~, 33GUI~とリスナー, 33~指向, 16–18~の生成, 75

仮想的機械, 25型, 76

boolean~, 76byte~, 76char~, 76double~, 76float~, 76int~, 76long~, 76short~, 76

関係演算, 77関数, 16既存アプレットを呼び出すアプリケーショ

ンの基本形, 53クラス, 75~の継承, 75

構造化プログラミング, 16コンストラクタ, 75コンピュータの基本構成, 16サブルーチン, 16算術演算, 77座標系, 27–28主記憶装置, 15条件分岐, 31ストアードプログラム, 15制御構造, 30代入演算, 79ダブルバッファ, 44注釈, 20ツールキット, 33手続き重視型, 17

反復表現, 31バイトコードインタプリタ, 23バイトコードコンパイラ, 23描画メソッド描画色の変更, 29

ファイル処理の基本形, 47–48フレームを伴うアプリケーションの基本

形, 52プログラミングツール~の使い方, 23–24

変数, 78–79~の型宣言, 30配列~, 30, 85–86

マウスを処理するプログラムの基本形, 35–37

メソッド, 28, 75–76描画~, 89–91

文字列の数値への変換, 80予約語, 76ライブラリクラス~, 33

リスナー, 33–34例外処理, 48論理演算, 77