Java解説/No.7/課題1
GUIアプリケーション
今回からいよいよGUIアプリケーション(Graphical User Interface)に入りました。今までとは表示の仕方こそ違いますが、プログラムの考え方は一緒です。
おそらく、課題を作る前に演習ページでソースコードを順を追ってGUIの考え方を解説していたのを見たと思いますので、ここではGUIの考え方は解説しません。もし読み飛ばしていたなら、1から順に追ってみてください。
元プログラムの動きの確認
課題に取りかかる前に、元のプログラムの動きを把握しておきましょう。これをスキップして課題にやろうとすると、わからないまま終わってしまいます。最初の状態がどのような感じかを見て、ソースコードと比較することで、構造が理解できます。
今回のプログラムは、起動すると「TIME」「PUSH」の2つのボタンがあるウィンドウが1つ表示されます。
「PUSH」を押すたびに、新しいウィンドウが開きます。何度もクリックすると、同じ場所に次々と作られていきます。VistaやMac OSであれば、ウィンドウの影がだんだん濃くなっていくのがわかるでしょう。
「TIME」ボタンは、PUSHボタンで一番新しく作られたウィンドウに、現在の時刻を表示します。注意したいのは、1度もPUSHボタンを押さずにTIMEボタンを押すと、Eclipseのコンソールにエラー(例外)が流れることです。なぜこのエラーがでるかは、後々ひも解いていきます。
課題を解く
今回の課題は、懇切丁寧に手順が示されています。その手順の通りやれば大丈夫です。
手順1
- MyFrameクラスに,ラベル(jLabel1と名付ける)を1つ追加せよ
ラベルって?
新しい言葉、ラベルがでてきました。ラベルとは、ウィンドウに文字を表示するためのものです。
スーパーのお肉に貼られたラベルを思い出してみてください。何の肉か、何の部位か、内容量は何グラムか、値段はいくらか…などの情報が書いてあります。
これと同じように、GUIプログラムでは、ウィンドウ(=肉)にラベルを貼って、文字を表示しているのです。
肉のラベルにはバーコードなんかも書いてありますが、プログラムのラベルは一般的に文字しか書けません。そのかわり、プログラムの中で何回でも文字を書き換えられます。
ラベルの考え方
演習ページ7-2の後ろの方で触れられていますが、ウィンドウの機能はJFrameというクラスで実現しています。JFrameのインスタンスを作ると、裏でウィンドウを準備してくれます。(この状態で画面に表示しろと命令して初めて画面に表示される)。
同様に、ラベルもJLabelというクラスで実現されており、インスタンスを作れば、ラベルを準備してくれます。ただし、このままでは何も書かれていないし、何にも貼られていません。なまえシールが台紙に貼られていて待機している状態です。例えば12枚のラベルのインスタンスを作ったら、以下のような台紙がイメージになります。
コードを見る・初期化
ソースコードを見ていきましょう。今回ラベルを貼る対象はMyFrameクラスですが、ラベル自体を見るのであれば、ChildFrameクラスの方が参考になりますので、そちらを見てみてください。
JLabel jLabel1 = new JLabel();
ChildFrameクラスを定義している部分の頭に、こんな1行があります。これは、『JLabelというクラス』のインスタンスを『jLabel1という名前』で作る、という意味になります。
わかりやすく、色をつけて構造を見てみます。
JLabel jLabel1 = new JLabel();
赤い部分 JLabel が2つありますが、これがクラスの名前です。一方、緑色の jLabel1 は、インスタンスの名前です。
イコールの左辺は、変数の名前と、その変数の型(どんな型の変数が入るか)を指定するための場所となります。C言語で int i = 0 なんてことをやりましたが、それと一緒の考え方で大丈夫です。
文をこの左辺の部分だけ、すなわち"JLabel jLabel1;"と書くと、そういう名前のインスタンスを『宣言』するということになります。宣言しただけではインスタンスはできていません。ただ単に、"こういう名前と型でインスタンスが作れるようにしますよ"としただけです。さっきの名前シールの例であれば、シール1枚分の台紙だけができた状態です。
そこでどうするかというと、台紙に実際にシールを作ります。これがイコールの右辺にあたる部分で、『初期化』になります。
文の右側を見ると、new JLabel(); となっています。これは、"JLabelというクラス"のインスタンスを新しく作ってください、ということになります。この作業をすることで、台紙にシールが貼られて、使える状態になったというわけです。
ちなみに、インスタンスがまだ作られていないときは、jLabel1にはnull という値が入っています。簡単にいうと『何もない』という意味です。この考え方はこの課題でものちのち使います。
ラベルの準備
ラベルが用意できたら、文字を書いて、貼る場所をきめて、ウィンドウにペタっと貼付ける必要があります。この処理は、ChildFrameクラスのコンストラクタ(そのクラスのインスタンスが作られたときに必ず呼び出される場所)に書かれています。
jLabel1.setText("");
jLabel1.setBounds(20, 80, 200, 30);
具体的にはこの2行です。さっきと同じように、 jLabel1 がインスタンスの名前になります。つまり、なまえシールそのもののことです。
このなまえシールの文字や、貼る場所を決めるために、そのためのメソッドがJLabelクラスに用意されています。 jLabel1 の直後に . (ドット)が打ってあるのがわかるでしょうか?このドットの後に、インスタンスに定義された、呼び出したいメソッドの名前を書き、その後に必要な引数を、括弧でくくって書きます。赤い背景の部分(setText、setBounds)がメソッドの名前です。
setTextは、その名の通りテキストをセットします。つまり、ラベルに書かれる文字を決めるのです。("") がまさにその部分で、2つの『"』(ダブルクオーテーション)で囲まれた部分が、ラベルに書かれる文字になります。この場合は、ダブルクオーテーションで囲まれている文字はありませんので、ラベルの文字をカラッポの文字に変える、ということになります。
setBoundsは、ウィンドウに貼り付けるときの場所を設定します。引数が4つあり、この場合は (20, 80, 200, 30) となっています。Javaのリファレンスや、Eclipseの自動補完で見るとわかりますが、左から順に (X座標, Y座標, Xサイズ, Yサイズ) という意味です。つまりこれは『X座標20、Y座標80の場所に、Xサイズ200、Yサイズ30の大きさのラベルを貼付ける』と設定することになるのです。
ウィンドウに貼り付ける
勘違いしやすい部分なのですが、ラベルの準備は終わったものの、あくまで準備が終わっただけなので、まだウィンドウには貼り付けられていません。なので、実際にウィンドウに貼付ける作業を行わなければ、実際にラベルには表示されません。
ウィンドウの仕組みを作っているJFrameクラスの中には、そのウィンドウにどんなコンポーネントが入っているかを管理する、ContentPaneという要素があります。この要素にjLabel1を追加することで、ウィンドウに実際にラベルが貼付けられます。
以前オブジェクト指向プログラミングの演習ページで、Javaにはgetterとsetterという考え方があったことを覚えているでしょうか?(演習ページ3-7の下の方を参照)
クラスの中である機能を実装するときに、実際の機能内容が複雑になりそうな時、その機能を構成するためのデータは、そのクラスの中だけで使えるようにし、実際にクラスを使う人にそれを意識させないようにする、というプログラムが必要になります。
(執筆中)
最終更新:2009年06月10日 19:07