第23週目課題

課題2301

次のようなウィンドウを作成して表示するプログラム Counter クラスをパッケージ j2.lesson10 に作成しなさい。


ただし、画面中央部に "0" と表示されているコンポーネントは javax.swing.JLabel のインスタンスとし、画面下部に表示されている2つのコンポーネント "down" と "up" はどちらも javax.swing.JButton のインスタンスとする。

また、このウィンドウのタイトルバーに表示する文字列は、上図のように "up/down counter" とすること。また、ウィンドウのサイズは 200x200 とすること。

j2.lesson10.Counter クラスには main メソッドを用意し、main メソッドを起動することによって上記のようなウィンドウを表示するようにすること。

手順

  1. 詳細な擬似コードを作成する
  2. パッケージ j2.lesson10 にクラス Counter を作成
  3. 必要なメソッドを作成する

(テストは 課題2302 と一緒に行う)

ヒント

java.awt.BorderLayout と java.awt.GridLayout を併用すればよい。

課題2302

課題2301 で作成したプログラムの各ボタン (down, up) に、次のようなアクションを追加しなさい。

up ボタンのアクション

up ボタンを押すと、画面中央部に表示されている数値が 1 だけ増加する。

例えば、以下のように画面中央部のラベルに 0 が表示されていた場合、


up ボタンを5回押すと次のようにラベルに 5 が表示される。


down ボタンのアクション

down ボタンを押すと、画面中央部に表示されている数値が 1 だけ減少する。

例えば、以下のように画面中央部のラベルに 5 が表示されていた場合、


down ボタンを2回押すと次のようにラベルに 3 が表示される。


プログラムを起動した直後では、画面中央部に表示されている数字は 0 とする。また、課題 2301 からウィンドウのサイズおよびタイトル、ボタンに表示されている文字列等は変更してはならない。

手順

指定した箇所で必ずテストを行うこと。

  1. テスト項目「Counterに対する骨格テスト」をパス
  2. 詳細な擬似コードを作成する
  3. j2.lesson10.Counter に上記のアクションを追加
  4. テスト項目「Counterに対する機能テスト」をパス

ヒント

up ボタンと down ボタンにそれぞれアクションを追加してもよいが、これらのアクションは非常に似ているため、どちらも同じクラスでアクションを記述してしまうのが楽である。

値を減少させるか増加させるかは、コンストラクタの引数に指定するなどの方法が考えられる。

また、これまでに何度も説明しているが、int 型と String 型を相互に変換するには次のメソッドを使えばよい。

テストの失敗メッセージ

骨格テスト

メッセージ 詳細
(クラス名), existence パッケージ内に課題で指定したクラスが存在していない。パッケージやクラス名を確認
(メンバ名), existence 指定されたメンバが存在しない
(メンバ名), public メンバを作る際に public の指定がない
(メンバ名), static メンバを作る際に static の指定がない
(メンバ名), type <T> メンバを作る際に型の指定を間違っている。正しくは <T>

機能テスト

メッセージ 詳細
フレーム <F> が見つかりません <F> の名前を持つフレームが見つからない。JFrame のコンストラクタに指定している文字列を確認
フレーム <F> は javax.swing.JFrame のインスタンスではありません <F> の名前を持つフレームが JFrame のインスタンスでない。java.awt.Frame を誤って使用していないか確認
<機能テストの項目名> <機能テストの項目名> で、FAIL ボタンを押した

機能テストの項目

テスト失敗時に「Results」の欄の左側に出る「test~」は、テストの項目名を表している。

項目名 詳細
起動直後の状態 プログラムを実行した直後のウィンドウ
up 左記の通りにボタンを押した後のウィンドウ
up, up 左記の通りにボタンを押した後のウィンドウ
up, up, up 左記の通りにボタンを押した後のウィンドウ
up, up, up, down 左記の通りにボタンを押した後のウィンドウ
up, up, up, down, down 左記の通りにボタンを押した後のウィンドウ

課題2303 (optional)

テキストファイルの一行目を表示するプログラム HeadLineViewer クラスをパッケージ j2.lesson10 に作成しなさい。

このクラスの main メソッドを実行すると、次のようなウィンドウが表示される。


ウィンドウの左下にあるコンポーネントは javax.swing.JTextField のインスタンス (以下、T) で、ここにテキストファイルの名前 (パス名) を入力し、右下にある javax.swing.JButton のインスタンスであるコンポーネント (以下、B) をクリックすると、画面中央部にある javax.swing.JLabel のインスタンスであるコンポーネント (以下、L) に、T で指定したテキストファイルの一行目に書かれている内容が表示される

例えば、U:\ex2303sample1.txt という以下の内容を持つファイルが存在したとする。

最初の行 (Head Line).
二行目.
三行目.

T に U:/ex2303sample1.txt と入力し、B をクリックすると、次のように表示される。


ただし、B をクリックした際に T で指定したテキストファイルが開けない場合や、テキストファイルの読み込み中に例外が発生した場合は、L に ファイルが読み込めません と表示する。


このウィンドウのタイトルバーに表示する文字列は、上図のように "head line viewer" とすること。また、ウィンドウのサイズは 400x150 とすること。

j2.lesson10.HeadLineViewer クラスには main メソッドを用意し、main メソッドを起動することによって上記のようなウィンドウを表示するようにすること。

手順

指定した箇所で必ずテストを行うこと。

  1. 詳細な擬似コードを作成する
  2. パッケージ j2.lesson10 にクラス HeadLineViewer を作成
  3. main メソッドを作成する
  4. アクションを記述するために必要なクラスが他にあれば、そちらも作成する
  5. テスト項目「HeadLineViewerに対する骨格テスト」をパス
  6. 各コンストラクタやメソッドにプログラムを書く
  7. テスト項目「HeadLineViewerに対する機能テスト」をパス

ヒント

演習で作成したプログラムと非常に似ている。相違点は、演習では指定したファイルの画像を表示していたのに対し、HeadLineViewer ではテキストの一行目を表示する点である。

ファイルから一行テキストを読み込むには、java.io.BufferedReader と java.io.FileReader を併用するとよい。

テストの失敗メッセージ

骨格テスト

メッセージ 詳細
(クラス名), existence パッケージ内に課題で指定したクラスが存在していない。パッケージやクラス名を確認
(メンバ名), existence 指定されたメンバが存在しない
(メンバ名), public メンバを作る際に public の指定がない
(メンバ名), static メンバを作る際に static の指定がない
(メンバ名), type <T> メンバを作る際に型の指定を間違っている。正しくは <T>

機能テスト

メッセージ 詳細
フレーム <F> が見つかりません <F> の名前を持つフレームが見つからない。JFrame のコンストラクタに指定している文字列を確認
フレーム <F> は javax.swing.JFrame のインスタンスではありません <F> の名前を持つフレームが JFrame のインスタンスでない。java.awt.Frame を誤って使用していないか確認
<機能テストの項目名> <機能テストの項目名> で、FAIL ボタンを押した

機能テストの項目

テスト失敗時に「Results」の欄の左側に出る「test~」は、テストの項目名を表している。

項目名 詳細
起動直後のウィンドウ プログラムを実行した直後のウィンドウ
.temp/ex2303sample1.txt を.. .temp/ex2303sample1.txt を作成し、テキストフィールドに先のファイル名を入力し、ボタンを押した後のウィンドウ
.temp/ex2303sample2.txt を.. .temp/ex2303sample2.txt を作成し、テキストフィールドに先のファイル名を入力し、ボタンを押した後のウィンドウ

それぞれのファイルの内容は以下の通りである。

最初の行 (Head Line).
二行目.
三行目.
#!/usr/bin/perl -w --
use strict;
our %ENV;
print "Content-type: text/html\n\n";
print "<html><head><title> Environments </title></head><body><table>\n";
print "<tr><th> name </th><th> value </th></tr>\n";
for my $key (keys %ENV) {
    print "<tr><td> $key </td><td> $ENV{$key} </td></tr>\n";
}
print "</table></body></html>\n";

課題2304 (optional)

ライツアウトというゲームに似たプログラム LightsOut クラスをパッケージ j2.lesson10 に作成しなさい。

このクラスの main メソッドを実行すると、次のようなウィンドウが表示される。


ウィンドウに表示された 5x5 の計25個のボタンは、それぞれクリックされると次のようなアクションを起こす。

プログラムが起動された直後は、全てのボタンには "ON" と書かれている。


例えば、画面中央にあるボタンをクリックすると、次のように画面中央にあるボタンと隣り合う4つのボタンが OFF になる。


さらにその左上のボタンをクリックすると、3 つの ON と表示されていたボタンが OFF に変化し、2 つの OFF と表示されていたボタンが ON に変化する。


その状態からウィンドウ内の最も左上にあるボタンをクリックすると、1 つの ON と表示されていたボタンが OFF に変化し、2 つの OFF と表示されていたボタンが ON に変化する。


最も左上にあるボタンは、自分とその隣り合うボタンが合計で 3 つしか存在しない。変化する対象はその3つのボタンのみである。

このウィンドウのタイトルバーに表示する文字列は、上図のように "lights out" とすること。また、ウィンドウのサイズは 300x320 とすること。

j2.lesson10.LightsOut クラスには main メソッドを用意し、main メソッドを起動することによって上記のようなウィンドウを表示するようにすること。

手順

指定した箇所で必ずテストを行うこと。

  1. 詳細な擬似コードを作成する
  2. パッケージ j2.lesson10 にクラス LightsOut を作成
  3. main メソッドを作成する
  4. アクションを記述するために必要なクラスが他にあれば、そちらも作成する
  5. テスト項目「LightsOutに対する骨格テスト」をパス
  6. 各コンストラクタやメソッドにプログラムを書く
  7. テスト項目「LightsOutに対する機能テスト」をパス

ヒント

javax.swing.JButton にアクションを設定する方法は、コンストラクタの引数に渡す方法の他に JButton.setAction(javax.swing.Action) メソッドの引数に渡すという方法がある (javax.swing.AbstractAction は javax.swing.Action インターフェースを実装している)。

また、ボタンのテキストを取得したり、ボタンにテキストを設定したりするには getText() や setText(String) メソッドを使用するとよい。

テストの失敗メッセージ

骨格テスト

メッセージ 詳細
(クラス名), existence パッケージ内に課題で指定したクラスが存在していない。パッケージやクラス名を確認
(メンバ名), existence 指定されたメンバが存在しない
(メンバ名), public メンバを作る際に public の指定がない
(メンバ名), static メンバを作る際に static の指定がない
(メンバ名), type <T> メンバを作る際に型の指定を間違っている。正しくは <T>

機能テスト

メッセージ 詳細
フレーム <F> が見つかりません <F> の名前を持つフレームが見つからない。JFrame のコンストラクタに指定している文字列を確認
フレーム <F> は javax.swing.JFrame のインスタンスではありません <F> の名前を持つフレームが JFrame のインスタンスでない。java.awt.Frame を誤って使用していないか確認
<機能テストの項目名> <機能テストの項目名> で、FAIL ボタンを押した

機能テストの項目

テスト失敗時に「Results」の欄の左側に出る「test~」は、テストの項目名を表している。

項目名 詳細
全てON プログラムを実行した直後のウィンドウ
1行目まで 1 行目の左から、1, 3, 4 番目のボタンを順にクリックした後のウィンドウ
2行目まで 「1行目まで」に加えて、2 行目の左から 1, 3, 4 番目のボタンを順にクリックした後のウィンドウ
3行目まで 「2行目まで」に加えて、3 行目の左から 1, 2, 3 番目のボタンを順にクリックした後のウィンドウ
4行目まで 「3行目まで」に加えて、4 行目の左から 1, 2, 4, 5 番目のボタンを順にクリックした後のウィンドウ
全てOFF 「4行目まで」に加えて、5 行目の左から 4, 5 番目のボタンを順にクリックした後のウィンドウ