Java道|16章のまとめ

Javaの基礎が、見える・動く・反応するアプリへ変わる。
16章は、文法やオブジェクト指向で学んだ力を、GUIアプリケーションとして形にするための大切な実践章です。

16章では、これまで学んできたJavaの文法やオブジェクト指向の考え方が、実際に「見えるアプリケーション」として形になっていく流れを学びました。

それまでの学習では、コンソールに文字を表示したり、条件分岐や繰り返しで処理を組み立てたり、クラスやオブジェクトを使ってプログラムを整理したりすることが中心でした。

System.out.println("修行を開始します");

このような文字中心のプログラムも、Javaの基礎としてとても大切です。

しかし、16章ではそこから一歩進みました。

ウィンドウを表示する。
ラベルやボタンを配置する。
ボタンやマウス操作に反応する。
画像や図形を描く。
クリックした場所に印を描く。
スレッドを使って時間とともに画面を変化させる。
そして、Javaの学習がスマートフォンアプリやWebアプリケーションのような応用分野へつながることも見てきました。

鬼滅の刃風にたとえると、これまでのJava学習は、鬼殺隊本部の修行場で基礎の型をひとつずつ覚えてきた段階です。

変数は、任務に必要な情報を記録する巻物。
条件分岐は、状況に応じて行動を変える判断力。
繰り返しは、同じ型を何度も鍛える反復修行。
クラスとオブジェクトは、隊士や道具を役割ごとに整理する設計図です。

そして16章では、その基礎を使って、本部の修行装置や作戦案内盤のような「見える画面」を作る段階に入りました。

ただ命令を順番に実行するだけでなく、ユーザーがボタンを押したら反応する。
マウスを動かしたら表示が変わる。
時間の流れに合わせて画面が更新される。

つまり、16章はJavaの知識が「動くアプリ」として実感できる章でした。ここでは、16章で学んだ内容を、鬼滅の刃風の世界観に置き換えながら整理していきます。

16章で学んだことの全体像

16章の内容を大きく整理すると、次のようになります。

学んだ内容できるようになったこと鬼滅の刃風のイメージ
ウィンドウの作成画面を持つアプリを作れる鬼殺隊本部に修行案内盤を設置する
AWTコンポーネントラベルやボタンなどの部品を置ける案内札や開始札を配置する
イベント処理ボタンやマウス操作に反応できる隊士の操作に修行装置が反応する
無名クラスやラムダ式イベント処理を簡潔に書ける臨時の制御係や短い指令札を使う
描画処理文字、図形、画像を画面に描ける作戦盤に印や修行カードを描く
repaint画面を描き直す依頼ができる表示盤へ再描画の伝令を送る
スレッド時間の流れを持つ表示を作れる修行段階を一定時間ごとに進める
応用分野Javaの学習が実践へつながる本部装置や携帯任務札の開発へ広がる

この一覧を見ると、16章は単に「ウィンドウを出すだけ」の章ではなかったことが分かります。

最初は、空のウィンドウを表示するところから始まりました。

そこにLabelやButtonなどの部品を配置し、ユーザー操作に反応するイベント処理を加え、Graphicsで文字や図形や画像を描き、さらにスレッドで時間に合わせた変化も作りました。

流れとしては、次のように広がっています。

ウィンドウを作る
  ↓
部品を置く
  ↓
操作に反応する
  ↓
画面に描く
  ↓
時間で動かす
  ↓
応用分野へつなげる

鬼滅の刃風に言えば、最初はただの修行部屋だったものが、案内札、操作札、記録盤、描画装置、自動更新機能を持つ本格的な修行装置へ育っていったような流れです。

↓クリックすると拡大表示されます。

ウィンドウを持つアプリケーションを作れるようになった

16章の最初で学んだ大きな一歩は、ウィンドウを表示することでした。

それまでのJavaプログラムでは、コンソールに文字を出す形が中心でした。

しかし、GUIアプリでは、Frameを使って画面そのものを表示できます。

public class Sample1 extends Frame

Frameは、ウィンドウ本体を表すクラスです。

このFrameを継承することで、自分のクラスをウィンドウとして扱えるようになりました。

ウィンドウを表示する基本の流れは、次のように整理できます。

手順内容
1Frameを継承したクラスを作る
2mainでオブジェクトを作る
3コンストラクタでタイトルを設定する
4setSizeで大きさを決める
5setVisible(true)で表示する
6WindowAdapterで閉じる操作に対応する

鬼滅の刃風にたとえると、Frameは鬼殺隊本部の「修行案内盤の土台」です。

土台を作り、名前札を付け、大きさを決め、隊士たちの前に表示する。
これが、GUIアプリの最初の形です。

Javaの要素鬼滅の刃風のイメージ
Frame修行案内盤の本体
super案内盤のタイトル札
setSize案内盤の大きさを決める
setVisible(true)案内盤を作戦室に表示する
WindowAdapter閉じる操作を見張る補助係
windowClosing停止札が押されたときの処理

ここで大切なのは、Javaのプログラムが「文字だけの世界」から「目で見える画面の世界」へ進んだことです。

ウィンドウを表示できるようになると、プログラムはユーザーが直接見て操作できるアプリケーションに近づきます。

AWTの部品を使って画面らしさを作れるようになった

ウィンドウを表示できても、何も置かれていない画面では、まだ使いやすいアプリとは言えません。

そこで学んだのが、AWTコンポーネントです。

コンポーネントとは、GUI画面に置く部品のことです。

AWTの部品役割鬼滅の刃風のイメージ
Label文字を表示する修行内容の案内札
Button押して操作する修行開始札
TextField1行入力する隊士名の入力欄
TextArea複数行入力する任務メモ欄
List一覧を表示する隊士一覧板
Panel部品をまとめる装置をまとめる区画
Canvas図形や絵を描く作戦図を描く板

たとえばLabelを使うと、画面に案内文を表示できます。

Label lb = new Label("次の修行場へ移動します");
add(lb);

ここで大切なのは、コンポーネントは作っただけでは表示されないことです。

new Labelで部品を作り、addでFrameに追加する必要があります。

処理意味
new Label案内札を作る
add(lb)案内札を修行案内盤に取り付ける
setForeground文字色を変える
setFont文字の見た目を変える

鬼滅の刃風に言えば、修行案内札を作っただけで倉庫に置いていても、隊士には見えません。

それを作戦案内盤に取り付けて、色や文字の大きさを整えることで、はじめて「使える画面」になります。

図:16章前半 ウィンドウと部品で画面を作る

↓クリックすると拡大表示されます。

この図が示していること

この図は、16章前半で学んだ「ウィンドウに部品を配置してGUI画面を作る流れ」を表しています。

Frameはウィンドウの土台です。
そこにLabel、Button、TextField、Panelなどのコンポーネントを追加して、使える画面にしていきます。

図の要素意味
FrameGUI画面の土台
Label文字を表示する部品
Button押して操作する部品
TextField文字入力の部品
Panel部品をまとめる区画
add作った部品を画面に配置する処理

この図から分かることは、GUIアプリはウィンドウだけで完成するのではなく、部品を組み合わせて画面を作るということです。

鬼滅の刃風に言えば、空の修行部屋に案内札や開始札を配置して、隊士が使える修行装置にしていくイメージです。

イベント処理によって画面が反応するようになった

16章の中でも特に重要だったのが、イベント処理です。

イベントとは、GUI上で起きる出来事のことです。

たとえば、次のような操作がイベントになります。

操作イベントの例
ボタンを押すActionEvent
マウスが部品に入るMouseEvent
マウスが部品から出るMouseEvent
マウスで画面を押すMouseEvent
ウィンドウを閉じるWindowEvent

イベント処理を学ぶことで、GUI画面は「ただ表示されるだけ」ではなく、「ユーザーの操作に反応する画面」になりました。

たとえば、Buttonを押したときに文字を変える処理では、ActionListenerを使いました。

bt.addActionListener(new SampleActionListener());

この登録によって、ボタンが押されたときにactionPerformedが呼ばれます。

イベント処理の基本構造は、次の3つで整理できます。

役割内容鬼滅の刃風のイメージ
ソースイベントが発生する部品修行開始札、修行案内盤
イベント実際に起きた出来事押された、入った、出たという合図
リスナイベントを受け取る処理担当合図を受け取る制御係

鬼滅の刃風に言えば、修行開始札が押されると、その合図が制御係に届き、制御係が表示を切り替えるようなものです。

ボタンを押す
  ↓
イベントが発生する
  ↓
リスナに通知される
  ↓
actionPerformedが呼ばれる
  ↓
表示が変わる

この流れを理解すると、GUIの「反応する仕組み」が見えてきます。

マウスイベントでより細かな反応を作れるようになった

ボタンを押すだけでなく、マウスの動きにも反応できるようになりました。

MouseListenerを使うと、次のようなマウス操作を扱えます。

メソッド呼ばれるタイミング鬼滅の刃風のイメージ
mouseClickedクリックしたとき修行札を押して離した
mousePressed押したとき修行盤に手を押し込んだ
mouseReleased離したとき押していた手を離した
mouseEntered部品の上に入ったとき手が修行札に近づいた
mouseExited部品の外へ出たとき手が修行札から離れた

たとえば、マウスがボタンに入ったら表示を変え、外に出たら元に戻す処理が作れました。

public void mouseEntered(MouseEvent e)
{
    bt.setLabel("修行メニューを選んでください");
}

public void mouseExited(MouseEvent e)
{
    bt.setLabel("修行場へようこそ");
}

このように、クリックしなくてもマウスが近づくだけで画面が反応するようになります。

鬼滅の刃風に言えば、隊士が修行案内札に手を近づけると、札が青白く光って案内文が変わるような仕組みです。

イベント処理を簡潔に書く工夫も学んだ

イベント処理は便利ですが、そのまま書くとコードが長くなりやすいことがあります。

特にMouseListenerのように、複数のメソッドを持つインターフェイスでは、使わないメソッドも書く必要がありました。

そこで学んだのが、MouseAdapter、無名クラス、ラムダ式などの書き方です。

書き方特徴鬼滅の刃風のイメージ
通常の内部クラス仕組みが分かりやすい専任の制御係を置く
Adapterクラス必要なメソッドだけ書ける必要な反応だけ担当する補助係
無名クラス登録場所の近くに処理を書けるその場限りの臨時制御係
ラムダ式短い処理を簡潔に書ける短い指令札を直接書く

たとえば、ActionListenerのように抽象メソッドが1つだけのインターフェイスでは、ラムダ式を使って短く書けます。

bt.addActionListener(e -> bt.setLabel("気を高めています"));

この書き方は、ボタンが押されたときの処理をすっきり書ける点が特徴です。

ただし、MouseListenerのように複数の抽象メソッドを持つものは、そのままラムダ式では書けません。

その場合は、MouseAdapterや無名クラスを使うと整理しやすくなります。

描画とイベント処理を組み合わせる考え方が見えてきた

16章では、画面に文字や図形や画像を描く処理も学びました。

描画の中心になるのが、paintとGraphicsです。

要素役割鬼滅の刃風のイメージ
paint実際に画面へ描く場所修行案内盤に内容を書く係
Graphics描画するための道具文字や印を描く万能筆
drawString文字を描く案内文を書く
drawImage画像を描く修行カードを表示する
fillOval塗りつぶした楕円を描く気のしるしを刻む
setColor色を指定する墨や光の色を変える
setFont文字の見た目を変える見出し札を大きくする

画像を読み込んで表示する場面では、Image、Toolkit、getImageも使いました。

Toolkit tk = getToolkit();
im = tk.getImage("training.jpg");

そして、paintの中でdrawImageを使って描画しました。

g.drawImage(im, 115, 80, this);

ここで大切だったのは、画像を読み込むことと、画像を画面に描くことは別の処理だという点です。

処理役割
getImage画像を読み込んで準備する
Image読み込んだ画像を保持する
drawImage画像を画面に描く

鬼滅の刃風に言えば、getImageは修行カードを巻物棚から取り出す処理です。
drawImageは、そのカードを修行案内盤に貼り出す処理です。

repaintで画面を描き直す流れを学んだ

16章では、イベント処理と描画処理をつなぐ重要な存在として、repaintも学びました。

たとえば、マウスで画面を押した場所に丸を描くプログラムでは、MouseEventから座標を取得しました。

x = e.getX();
y = e.getY();
repaint();

ここで、xとyを変えただけでは画面の見た目はすぐに変わるとは限りません。

そこでrepaintを呼び、Javaに「画面を描き直してください」と依頼します。

処理役割
e.getX押した場所の横座標を取得する
e.getY押した場所の縦座標を取得する
x、yに保存描画位置を記録する
repaint再描画を依頼する
paint最新のx、yを使って描く
fillOval指定位置に丸を描く

鬼滅の刃風に言えば、水月が修行案内盤を押すと、その場所の座標が記録されます。

ただし、記録しただけでは案内盤の表示は変わりません。
支援隊士が「描き直してください」と伝令を出す必要があります。
その伝令がrepaintです。

そしてpaintが呼ばれ、最新の座標に気のしるしが描かれます。

図:16章中盤 イベント処理と描画がつながる

↓クリックすると拡大表示されます。

この図が示していること

この図は、16章中盤で学んだイベント処理と描画処理のつながりを表しています。

ユーザーがボタンを押したり、マウスで画面を押したりすると、イベントが発生します。

そのイベントは、登録されたリスナに通知されます。

リスナは必要な処理を行い、画面を更新したいときにrepaintを呼びます。

そしてpaintが呼ばれ、Graphicsを使って文字、画像、図形などを描き直します。

図の要素意味
イベント処理ユーザー操作を受け取る仕組み
リスナイベントを受け取る処理担当
repaint再描画を依頼する橋渡し
paint実際に画面を描く場所
Graphics文字、図形、画像を描く道具

この図から分かることは、GUIアプリでは「操作を受け取る処理」と「画面に描く処理」が分かれており、repaintがその間をつないでいるということです。

スレッドによって時間の流れを持つ画面が作れるようになった

16章の後半では、スレッドを使ったアニメーションも学びました。

それまでのGUI画面は、ボタンを押したら変わる、マウスを動かしたら変わる、というように、ユーザー操作をきっかけに変化するものが中心でした。

そこにスレッドを使うと、時間の経過に合わせて画面を変化させることができます。

たとえば、修行段階を1秒ごとに変えるプログラムでは、Runnable、Thread、run、sleep、repaint、paintを組み合わせました。

public class Sample7 extends Frame implements Runnable

このように、Frameを継承しながらRunnableを実装することで、ウィンドウとして動きながら、スレッドで実行する処理も持てるようになりました。

スレッドによるアニメーションの基本の流れは、次の通りです。

流れ内容
1Threadを作る
2startでスレッドを開始する
3runが動く
4表示する値を更新する
5repaintで再描画を依頼する
6Thread.sleepで少し待つ
7この流れを繰り返す

鬼滅の刃風にたとえると、修行表示盤に時間管理係がついたようなものです。

その係が一定時間ごとに修行段階を進めます。
そして、表示盤へ描き直しの合図を送り、少し待ってから次の段階へ進みます。

スレッドと描画の役割分担

スレッドを使ったアニメーションでは、runとpaintの役割を分けて考えることが大切でした。

メソッド役割
run時間に沿って値を変え、repaintを呼ぶ
paint現在の値を使って画面を描く
Thread.sleep次の更新まで待つ
repaintpaintを呼ぶきっかけを作る

たとえば、runの中では、stepの値を更新します。

step = i;
repaint();
Thread.sleep(1000);

一方、paintの中では、その時点のstepを使って文字を描きます。

g.drawString("修行段階 " + step + " に到達", 90, 150);

この役割分担を鬼滅の刃風に置き換えると、次のようになります。

Javaの要素鬼滅の刃風のイメージ
Thread修行の時間管理係
run段階更新の任務内容
step現在の修行段階
repaint表示盤への描き直し命令
paint表示盤に文字を書く係
sleep次の段階までの一呼吸

アニメーションは、単に文字を変えるだけでは成立しません。

値を変える。
描き直す。
少し待つ。
それを繰り返す。

この流れがあるから、画面が時間とともに変化して見えるようになります。

16章で見えてきたオブジェクト指向の実感

16章はGUIが中心でしたが、その中にはオブジェクト指向の考え方もたくさん登場しました。

ウィンドウも、ボタンも、ラベルも、画像も、イベントを処理するリスナも、すべてオブジェクトとして扱いました。

オブジェクト指向の見方Javaでの例鬼滅の刃風のたとえ
クラスFrame、Button、Label修行装置や札の設計図
オブジェクトnew Button、new Label実際に置かれた開始札や案内札
継承extends Frame基本の案内盤を受け継ぐ
インターフェイスimplements Runnable、ActionListener守るべき役割の約束
メソッドpaint、run、actionPerformed描く、進める、反応する動作
フィールドButton bt、int step部品や状態を保存する場所

鬼滅の刃風に言えば、修行場を構成するものがそれぞれ役割を持っています。

Frameは修行場そのもの。
Buttonは修行開始札。
Labelは案内表示板。
Listenerは合図を受け取る制御係。
Threadは時間を進める進行係。
Graphicsは表示盤に描く筆。

それぞれのオブジェクトが役割を持ち、組み合わさることでGUIアプリが動きます。

つまり、オブジェクト指向は難しい理屈だけではありません。

役割ごとに部品を分け、それらを協力させてアプリを作る考え方です。

16章は、その実感を得やすい章でした。

Javaの応用分野へつながる入口も見えてきた

16章では、GUIやイベント処理だけでなく、その先の応用分野も見えてきました。

Javaで画面を作り、操作に反応し、描画し、時間に合わせて動かすことができるようになると、実際のアプリ開発のイメージが広がります。

16章で学んだことつながる先
ウィンドウ作成デスクトップアプリの画面
コンポーネントユーザーインターフェース
イベント処理ボタン、クリック、タップへの反応
描画視覚的なアプリ表現
画像表示アイコン、カード、画面素材の表示
repaint操作に応じた画面更新
スレッドアニメーション、時間管理、並行処理
オブジェクト指向大きなシステムの整理

鬼滅の刃風に言えば、修行場で覚えた技が、その場だけで終わらず、実戦任務や本部システム開発へ広がっていく状態です。

携帯任務札のようなスマートフォンアプリ。
本部中央管理装置のようなWebシステム。
作戦案内盤のようなデスクトップアプリ。
任務記録を扱う業務ツール。

Javaの基礎は、こうした分野へ進むための土台になります。

図:16章後半 学んだ内容が応用分野へつながる

↓クリックすると拡大表示されます。

この図が示していること

この図は、16章で学んだ内容が1つの流れとしてつながっていることを表しています。

最初はFrameでウィンドウを作りました。
次に、LabelやButtonなどのコンポーネントを置きました。
さらに、イベント処理でユーザー操作に反応できるようになりました。
その後、Graphicsで文字や図形や画像を描き、repaintで画面を更新しました。
最後に、Threadを使って時間とともに画面を動かす考え方を学びました。

学習内容できるようになったこと
ウィンドウ画面を持つアプリを作る
コンポーネント部品を配置して画面を構成する
イベント処理ユーザー操作に反応する
描画文字、図形、画像を表示する
スレッド時間に合わせて画面を変化させる
応用分野実際のアプリやWeb開発へつなげる

この図から分かることは、16章の内容がバラバラの知識ではなく、GUIアプリケーションを中心にきれいにつながっているということです。

16章を学んだあとに持っておきたい感覚

16章を終えた段階で大切なのは、「Javaで画面を持つアプリケーションが作れるようになってきた」という実感です。

もちろん、まだ本格的な実務アプリを自由自在に作るには、さらに多くの学習が必要です。

しかし、16章まで学ぶと、次のようなことが見えてきます。

できるようになったこと意味
ウィンドウを表示できるアプリ画面の土台を作れる
部品を配置できる画面に意味を持たせられる
操作に反応できるユーザーが使えるアプリに近づく
文字や図形を描ける視覚的な表現ができる
画像を表示できる画面の分かりやすさを高められる
クリック位置を扱える操作に応じた描画ができる
スレッドで動かせる時間の流れを持つ画面を作れる

鬼滅の刃風に言えば、基礎の型を覚えた隊士が、ついに本部の修行装置を自分で扱えるようになってきた段階です。

案内盤を作る。
操作札を置く。
隊士の操作に反応させる。
気のしるしを描く。
修行段階を時間で進める。

こうした動きを作れるようになったことは、とても大きな前進です。

これから先へ進むための見方

16章を学んだあとは、目の前のコードだけでなく、その知識がどこへつながるのかを意識すると理解が深まりやすくなります。

今回の学び先につながる見方
ウィンドウ作成アプリの画面設計
コンポーネントユーザーインターフェース作り
イベント処理使いやすい操作性
MouseEventマウス操作や座標処理
Graphics視覚的な表現
repaint状態変化に応じた画面更新
Thread動きや待ち時間のある処理
Runnableスレッドで動かす処理の整理
応用分野の理解実際の開発現場への意識

この見方を持つと、16章はJava学習の終わりではなく、実践的な開発へ向かう入口として見えてきます。

鬼滅の刃風に言えば、修行場で覚えた型を、任務装置、携帯任務札、本部中央管理装置、作戦案内盤の開発へ広げていく段階です。

Javaの学習は、ひとつの命令を覚えるだけではありません。

学んだ命令や仕組みを組み合わせて、画面を作り、操作に反応させ、描画し、動かし、実際のアプリへつなげていくことが大切です。

16章は、その流れを体験できる重要な章でした。