第24週目課題

課題2401

画像を表示するプログラム ImageViewer2 クラスをパッケージ j2.lesson11 に作成しなさい。

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


メニューバーにある "ファイル" メニューをクリックすると、下図のようにさらに "開く" というメニューが表示される。


上図の "開く" をクリックすると、ファイルを開くための選択ウィンドウが表示される。


上図の選択ウィンドウでファイルを選択すると、そのファイルを画像ファイルとして下図のようにウィンドウに表示する。


また、ファイルが選択されるたびにその画像を表示させること。すでに何らかの文字列や画像がウィンドウに表示されている状態で、新しい画像が選択された場合には、表示中の文字列や画像を消した後に新しい画像を表示すること

スクロールバーをドラッグさせることにより、下図のように画像をスクロールさせることが可能である。


先ほどの選択ウィンドウでファイルを選択しなかった場合 (取り消しボタンがクリックされたり、Escキーが押された場合)、下図のように "画像が選択されませんでした" とだけ表示する。すでに何らかの文字列や画像がウィンドウに表示されていた場合には、表示中の文字列や画像を消した後に "画像が選択されませんでした" と表示すること。


なお、選択した画像ファイルが開けなかった場合などについては考慮しなくてよい。

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

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

手順

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

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

ヒント

第23週目演習第24週目演習が参考になるはずである。演習ではファイルを開いて javax.swing.JTextArea に内容のテキスト表示していたが、この課題では javax.swing.JLabel に選択された画像を表示する。

また、JLabel に表示されているテキストを消すには

label.setText("");

と、setText メソッドに対して空の文字列を指定し、表示されている画像 (アイコン) を消すには

label.setIcon(null);

と、setIcon メソッドに対して null という値を指定すればよい。

テストの失敗メッセージ

骨格テスト

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

機能テスト

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

機能テストの項目

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

項目名 詳細
起動直後のウィンドウ プログラムを起動した直後に表示されるウィンドウ
ファイルメニューを選択 メニューバーの "ファイル" を選択した場合のウィンドウ
開くメニューを選択 メニューバーの "ファイル" > "開く" を選択した場合のウィンドウ
ex2401sample1.jpg を開いた ファイル選択時に <現在のディレクトリ>/.temp/(左のファイル名) を開いた場合のウィンドウ
ex2401sample2.jpg を開いた ファイル選択時に <現在のディレクトリ>/.temp/(左のファイル名) を開いた場合のウィンドウ
ファイルの選択をキャンセル ファイル選択画面でキャンセルを押した場合のウィンドウ

課題2402 (optional)

テキストファイルを編集するためのプログラム TextEditor クラスをパッケージ j2.lesson11 に作成しなさい。

このクラスの main メソッドを実行すると、次のようなウィンドウが表示される (以下、ウィンドウを縮小したものを表示する)。


ウィンドウ中央に配置されている GUI コンポーネントには複数行のテキストを書き込むことができ、コンポーネント内に収まりきらないような長いテキストを書き込んだ場合には、下図のようにスクロールバーを自動的に表示させる (行の折り返しは行わなくてよい)。


また、メニューバーの "ファイル" という項目を選択すると、下図のように上から順に "開く" "保存" という2つのメニューが表示される。


上図の "保存" をクリックすると、ファイルを保存するための選択ウィンドウが表示される。


ファイルを選択すると、先ほどウィンドウ中央に配置されている GUI に書いたテキストの内容が、選択したファイル内に保存される。ファイルにテキストを保存する際に何らかの例外が発生した場合は、特に何も行わない (保存できなくても問題ない)。

また、下図の "開く" メニューを選択した際の動作は演習で作成した TextViewer クラスのそれと同じものにすること。つまり、ファイルを選択させ、選択されたファイルをウィンドウに表示させる。

このウィンドウのタイトルバーに表示する文字列は、上図のように "text editor" とすること。また、ウィンドウのサイズは 400x400 とすること (上図はウィンドウサイズを変更してある)。

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

手順

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

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

ヒント

この課題は演習で作成したプログラムにいくつかの機能を付け加えたものである (TextEditor は TextViewer の機能を全て備えている)。

具体的には、TextViewer と TextEditor では次の点が異なる。

TextViewer のいくつかのメンバは protected として宣言されている。これをうまく利用すると、上記の相違点だけに着目してプログラムを書くことができるはずである。

なお、javax.swing.JTextArea には、getText() というメソッドが用意されている。

テストの失敗メッセージ

骨格テスト

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

機能テスト

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

機能テストの項目

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

項目名 詳細
起動直後のウィンドウ プログラムを起動した直後に表示されるウィンドウ
簡単なプログラムを記述 テキストエリア内に簡単なプログラムを記述した直後のウィンドウ
メニューを開く メニューバーの "ファイル" > "開く" を選択した場合のウィンドウの状態
ex2402sample1.txt を作成直後 ファイル選択時に <現在のディレクトリ>/.temp/(左のファイル名) を作成した場合のウィンドウ
ex2402sample2.txt を開いた ファイル選択時に <現在のディレクトリ>/.temp/(左のファイル名) を開いた場合のウィンドウ
ファイルの選択をキャンセル ファイル選択画面でキャンセルを押した場合のウィンドウの状態

課題2403 (optional)

テキストファイルや画像ファイルの内容を表示するプログラム MultiViewer クラスをパッケージ j2.lesson11 に作成しなさい。

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


メニューバーにある "ファイル" メニューをクリックすると、下図のようにさらに "開く" というメニューが表示される。


上図の "開く" をクリックすると、ファイルを開くための選択ウィンドウが表示される。


上図の選択ウィンドウで、拡張子 (ファイル名についている .html, .avi などの「.」以降の文字列) が "txt" であるファイルを選択すると、そのファイルをテキストファイルとみなし、下図のようにファイル内のテキストを表示する。コンポーネント内に収まりきらないような長いテキストを読み込んだ場合には、下図のようにスクロールバーを自動的に表示させる (行の折り返しは行わなくてよい)。


また、ファイル選択ウィンドウで拡張子が "jpg" または "png" であるファイルを選択すると、下図のように選択されたファイルを画像ファイルとみなしてウィンドウに表示する。こちらもコンポーネント内に収まりきらない場合にはスクロールバーを表示してスクロール可能にすること。


なお、選択したファイルの拡張子が "txt", "jpg", "png" のいずれでもない場合は何もしない。また、選択されたテキストや画像ファイルが読み込めなかった場合については考慮しなくてよい。

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

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

手順

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

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

ヒント

Content Pane や JPanel などの java.awt.Container を継承したコンポーネントは、他のコンポーネントを貼り付けるメソッド add(Component) のほかに、貼り付けてあるコンポーネントを削除するメソッド remove(Component) や removeAll() というメソッドがある。

ウィンドウを表示中にコンポーネントを削除したり追加したりする場合、追加削除したコンポーネントを正しく表示できないことがある。そのような場合には、ウィンドウに対して validate() というメソッドを呼び出すとよい。これは、ウィンドウ (コンテナ) に貼り付けられている全てのコンポーネントを検証し、正しく表示しなおしてくれるという機能を持つ (java.awt.Container 内で定義されている)。

また、ファイルの拡張子を調べるには、java.lang.String クラスの endsWith(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~」は、テストの項目名を表している。

項目名 詳細
起動直後のウィンドウ プログラムを起動した直後に表示されるウィンドウ
ex2403sample.jpg を開いた ファイル選択時に <現在のディレクトリ>/.temp/(左のファイル名) を開いた場合のウィンドウ
ex2403sample.txt を開いた ファイル選択時に <現在のディレクトリ>/.temp/(左のファイル名) を開いた場合のウィンドウ
ex2403sample.png を開いた ファイル選択時に <現在のディレクトリ>/.temp/(左のファイル名) を開いた場合のウィンドウ
ex2403sample.zip を開いた ファイル選択時に <現在のディレクトリ>/.temp/(左のファイル名) を開いた場合のウィンドウ (.zip なので何もしない)

課題2404 (SPECIAL)

(余力があれば挑戦してみよ)

課題2401 で作成した ImageViewer2 のプログラムを改良し、画像を表示する部分にファイルをドロップ (ファイルの上でマウスボタンを押し、そのままマウスを移動させ、そして画像を表示する部分でマウスボタンを離す) した際にその画像を表示できるようにせよ。

ヒント

下記の URL が参考になる。

ヒントとして、上記の機能を実装した際に宣言した import を列挙する。

import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDropEvent;
import java.io.File;
import java.io.IOException;
import java.util.List;

また、実際に使用したいくつかのメンバの名前を列挙する。