静岡理工科大学 総合情報学部 (by 菅沼) 菅沼ホーム 目次

第6章 Windows プログラミング

  1. 6.1 Windows とアプレット
    1. 6.1.1 Windows
        (プログラム例6.1) Window の生成と消滅
    2. 6.1.2 アプレット
        (プログラム例6.2) 加算
        (プログラム例6.3) 文字列の検索
  2. 6.2 グラフィックス
      (プログラム例6.4) 加算と図形
    1. (演習問題)
  3. 6.3 イベント処理
      (プログラム例6.5) Window の生成と消滅
      (プログラム例6.6) マウスイベント
    1. (演習問題)
  4. 6.4 AWT と Swing
      (プログラム例6.7) 加算(テキストフィールドとボタン)
      (プログラム例6.8) チェックボックスとラジオボタン
    1. (演習問題)
  5. 6.5 マルチスレッドとアニメーション
      (プログラム例6.9) マルチスレッド
      (プログラム例6.10) 円の連続描画
      (プログラム例6.11) 図形の移動(単一図形)
      (プログラム例6.12) 図形の移動(複数図形)
      (プログラム例6.13) 画像メモリの操作
      (プログラム例6.14) 簡単なシューティングゲーム
    1. (演習問題)

6.1 Windows とアプレット

  今まで学習したプログラムは,キーボードからデータを入力し,結果をコマンドプロンプト上に文字として出力するといった形式のものだけでした.しかし,Java には,GUI( Graphical User Interface )を扱うための多くのクラスが用意されています.この章以降においては,それらについて順に学習していきますが,この節では,その基本について学びます.

  Java において GUI を扱う方法としては,大きく分けて二つの方法があります.一つは,今まで述べてきたプログラムのように,通常のアプリケーションソフトウェアとして作成し,コマンドプロンプトから実行し,そのプログラム内で Windows を生成し,各種の処理を行う方法です.あと一つは,アプレットとして Web ページに挿入し,その中で様々な処理を行う方法です.いずれの方法においても,その基本はほとんど同じです.この章以降においては,アプレットによる方法に関して説明していきますが,まず最初に,両者の方法について簡単に説明しておきます..

6.1.1 Windows

  以下に示す例では,Frame クラスを継承したクラス Win によって Window を生成しています.main メソッドの引数として 2 つの整数を渡し,それらの和を計算していますが,Java で利用できる GUI について全く説明してありませんので,Window 内には何も表示せず,結果はコマンドプロンプトに出力しています.そのため,あまり意味のあるプログラムになっていません.

(プログラム例6.1) Window の生成と消滅

  一般に,プログラムが大きくなると多くのクラスファイルが生成されます.そのため,作成したプログラムを配布するような場合に面倒になります.そこで,Java では,jar コマンドを使用して,複数のファイルを圧縮しながら 1 つのファイルにまとめることができます.そのためには,まず,メインメソッドを含むクラスを指定するため,次の 1 行からなるマニフェストファイル(ファイル名は任意ですが,ここでは「 manifest.txt 」としておきます)を作成します(必ず改行しておくこと).
Main-Class: Test

次に,jar コマンドによって JAR ファイル(名称は任意,ここでは,window.jar )を生成します.
jar cvfm window.jar manifest.txt *.class

なお,jar コマンドの一般形は以下に示す通りであり,クラスファイルだけでなく,画像等のファイルを含めることも可能です.
jar [オプション] JARファイル [マニフェストファイル] [圧縮するファイル ・・・]

  以上の手続きによって作成された JAR ファイルをダブルクリックするか,または,以下のコマンドを入力することによってプログラムを実行することができます.
java -jar window.jar

6.1.2 アプレット

  Java プログラムを Web ページ内で実行させるには,OBJECT 要素を使用します.また,OBJECT 要素内で PARAM 要素を使用することによって,ホームページから Java プログラムへパラメータを引き渡すことが出来ます.

  OBJECT 要素と PARAM 要素の一般的使用方法を記述すれば,以下のようになります.この例では,カレントディレクトリの下にある「applet」内の「Ball.class」を実行する場合を示しています.HTML ファイルと同じディレクトリにある場合は,パラメータ codebase に対する記述は必要ありません.以下の説明において,"[" と "]" で囲まれた部分はオプションです.
<object type="application/x-java-applet" width="600" height="400">
	<param name="code" value="Ball.class">
	<param name="codebase" value="applet/">
	[<param name="パラメータ名" value="値">]
</object>
		
  アプレットに対しても jar ファイルを利用することが可能です.例えば,
jar cvf Ball.jar *.class

のようにして作成された jar ファイルをアプレットで利用する場合は,以下のようになります.
<object type="application/x-java-applet" width="600" height="400">
	<param name="code" value="Ball">
	<param name="codebase" value="applet/">
	<param name="archive" value="Ball.jar">
	[<param name="パラメータ名" value="値">]
</object>
		

(プログラム例6.2) 加算

  以下に示す例では,Applet クラスを継承したクラス Test によってアプレットを表示しています.プログラム例6.1 と同様,Java で利用できる GUI について全く説明してありませんので,アプレット内には何も表示せず,渡されたパラメータに対する加算結果は Java コンソールに出力しています.なお,アプレット実行時におけるエラーメッセージも,Java コンソールに表示されますので注意してください.

(プログラム例6.3) 文字列の検索

  下に示した HTML ファイルと Java のプログラムは,パラメータとして 1 番目に与えた文字列内に,2 番目に与えた文字列が含まれていれば "見つかりました",そうでなければ"見つかりません" と Java コンソールに表示するためのものです(ページの表示).A〜Dに入る文字列を答えてください.

6.2 グラフィックス

  この節から,本格的にアプレットを作成していきます.Java には,Window の生成,ボタンの作成,チェックボックスの作成といったグラフィカルなユーザインタフェースを作成できるようなクラスライブラリが含まれています.その一つが,AWT ( Absract Window Toolkit )です.AWT の各種コンポーネントは,「ピアモデル」という方法で設計されてきました.ピア( peer )とは,ある作業を行うために自分に協力してくれる仲間ないし相手を言います.AWT の各コンポーネント毎に,それと対をなすプラットホーム固有の部品(ピア,実際の作業を行う)が作成されていました.

  しかし,ピアをユーザが直接書き直すことができないため,あるコンポーネントの機能を拡張したいような場合は困難が生じます.そこで,ピアを持たないコンポーネント( lightweight component:軽量部品)もサポートするようになりました(従来のピアを持つコンポーネントを heavyweight component:重量部品と呼ぶ).それらの軽量部品は Swing と呼ばれ,「javax.swing.*」というパッケージにまとめて提供されています.Swing では,プラットホーム毎,または,個人の好みによってに見え方を変えたりしたいような場合,ルックアンドフィール( look & feel )機能によって行います.Swing は,AWT に比較し,より豊富で,より機能の高いユーザインタフェースを持っています.

(プログラム例6.4) 加算と図形

  下に示した HTML ファイルと Java のプログラムは,プログラム例6.2 と同様,渡されたパラメータの加算を計算するものです.しかし,プログラム例6.2 とは異なり,加算結果をアプレット内に表示しています.また,同時に,簡単な図形も描いています(ページの表示).

-------------------------演習問題開始-------------------------

  プログラム例6.4 と似たプログラムを作成してみましょう.

-------------------------演習問題終了-------------------------

6.3 イベント処理

  マウスがクリックされた,ボタンが押された,Window が開始された,等のことをイベント(事象)と言います.このようなイベントが発生したとき行う処理をイベント処理といいます.ここでは,Java において,イベント処理がどのようにして行われているかについて学びます.

  イベントは,イベントの種類毎に,クラスに分類されています( AWTSwing ). イベントが発生すると,イベントソースは対応するイベントを記述するイベントオブジェクトを生成します.これを,イベントリスナに送出して対応する処理を行うわけですが,そのためには,イベントリスナがそのイベントを「聞く」準備ができていなくてはなりません.その準備を行うのがイベント登録メソッドイベント削除メソッドもあります)です.

  イベントの送出は,リスナのインタフェース(または,イベントアダプタ)に定義されているイベント応答メソッドハンドラメソッド)の内1つを呼び出し,引数としてイベントソースが生成したイベントオブジェクトを渡すといった方法で行われます.

  イベントリスナはインタフェースとして提供されています.これは,各イベントの処理がアプリケーションによって異なる場合が多いからです.しかし,インタフェースを実装する際には,インタフェースに定義されているすべてのメソッド(ハンドラメソッド)を実装しない限り,抽象クラスとなり,インスタンスを生成できなくなります.実際にすべてのメソッドを必要とする場合は問題ありませんが,一部のメソッドだけを使用したい場合は,必要としないメソッドまですべて定義しなければならず,余分な作業が必要になります.

(プログラム例6.5) Window の生成と消滅

  Window の生成と消滅を行ったプログラム例6.1 においては,イベント処理に関して説明をしませんでしたので,ここで詳細に説明します.この例では,アプレットから新しい Window を生成し,イベントリスナを使用して,Window を閉じています(ページの表示).

  上のプログラムで示したように,インタフェースを使用すると,必要のないメソッドまでオーバーライドしてやる必要があります.これを避ける方法として,各イベント応答メソッドを具体的な形で所有しているイベントアダプタクラスを継承する方法があります.しかし,クラス Win1 は,すでに Frame クラスを継承しています.Java では,複数のクラスを同時に継承することはできないため,Frame クラスとイベントアダプタクラスを同時に継承することができません.そこで,次に示すプログラムにおいては,WinEnd という内部クラス(クラス内のクラス)を定義し,そのクラスにイベントアダプタクラスを継承させることによって,この問題を避けています(ページの表示).

(プログラム例6.6) マウスイベント

  以下に示すプログラムは,マウスイベントに対する処理例です.ページを表示してもらえば明らかなように,アプレット内にマウスが入ると「入った」,また,出ると「出た」というメッセージが表示されます.さらに,アプレット内でマウスの左ボタンをクリックすると,クリックした場所に「クリック」というメッセージが表示されます.

  上と全く同じ処理を,MouseAdapter クラスを利用して実現しています(ページの表示).A〜Bに入る文字列を答えてください.

-------------------------演習問題開始-------------------------

  マウスイベントを利用して,簡単なお絵かきソフトを作成してみます.

-------------------------演習問題終了-------------------------

6.4 AWT と Swing

  AWT や Swing には,ユーザインタフェース作成用の様々な部品があります.ここで,そのすべてについて説明するわけにはいきませんが,主要なものは以下に示す通りです.

  1. AWT : Button,Swing : JButton : ボタン
  2. AWT : Checkbox,Swing : JCheckbox : チェックボックス(複数項目から複数選択)
  3. AWT : CheckboxGroup,Swing : JRadioButton : ラジオボタン(複数項目から1つを選択)
  4. AWT : Choice,Swing : JComboBox : ドロップダウンリスト(矢印をクリックと,選択項目が表示される)
  5. AWT : List,Swing : JList : 縦に並んだ項目から選択
  6. AWT : Label,Swing : JLabel : ラベル(文字列を表示)
  7. AWT : Scrollbar,Swing : JScrollbar : スクロールバー
  8. AWT : TextArea,Swing : JTextArea : 複数行にわたる文字列の編集と表示
  9. AWT : TextField,Swing : JTextField : 1行の文字列の編集と表示
  10. AWT : MenuBar,Swing : JMenuBar : メニューバー
  11. AWT : MenuItem,Swing : JMenuItem : メニューバーの各メニューが押されたときに現れるメニュー項目

  上記のコンポーネントを画面上に並べる方法(レイアウト)も重要です.AWT ( BoxLayout を除き,Swing と共通)には,レイアウトに関して,以下に述べるようなクラスが準備されています.「 setLayout(null) 」を使用して,レイアウトマネージャを使用しない方法もあります.

  1. BorderLayout: コンテナ(画面)を5つの領域(上,下,左,中,右)に分けて,コンポーネントを配置
  2. CardLayout: 同じ領域に複数のコンポーネントを重ねて配置
  3. FlowLayout: コンポーネントを可能な限り横1行に配置(アプレットのデフォルトレイアウト)
  4. GridLayout: コンポーネントを格子状に配置
  5. GridBagLayout: 格子状のセルにコンポーネントを柔軟に配置(配置方法は,GridBagConstraints クラスのメソッドで指定)
  6. BoxLayout: コンポーネントを縦,または,横に配置( Swing だけで使用可能)

(プログラム例6.7) 加算(テキストフィールドとボタン)

  以下に示すプログラム(ページの表示)は,整数の加算を行うためのアプレットであり,左側の 2 つのテキストフィールドに値を入力し,「=」ボタンをクリックすると,結果が右側のテキストフィールドに表示されます.

  上のプログラムでは,ActionListener を使用しましましたが,以下に示すプログラムのように,MouseListener ( MouseAdapter )を使用して書くことも出来ます(ページの表示).17 行目,46 行目,及び,63〜73 を除き,基本的に上のプログラムと同じです.

  次に,上と全く同じプログラムを,Swing の JAppletJButtonJLabel,及び,JTextField を利用して書いたものが以下に示すプログラムです(ページの表示).JApplet には,JRootPane が唯一の子として格納されます.このクラスのコンテナである contentPane が,JApplet のすべての子の親になります.そのため,部品の貼り付けやレイアウトの変更( contentPane には,BorderLayout がデフォルトで設定されている)は,contentPane に対して行ってやる必要があります.

(プログラム例6.8) チェックボックスとラジオボタン

  このアプレットでは,チェックボックスとラジオボタンを配置しています.チェックボックスやラジオボタンの各項目を選択すると,どれがクリックされたかという情報と,現在のチェックボックスとラジオボタンの状態を,テキストエリアに出力しています.以下に示すのが,その HTML,及び,Java プログラムです.

  上に示したプログラムのA〜Dに入る数値または文字列を答えてください.

  次に,上と全く同じプログラムを,Swing の JAppletJPanelJTextAreaJCheckBox,及び,JRadioButton を利用して書いたものが以下に示すプログラムです(ページの表示).上に示したプログラムとは異なり,ActionListener を利用している点に注意してください.また,contentPane を利用する点は,プログラム例6.7 と同じです.

-------------------------演習問題開始-------------------------

  整数の加算または減算の練習を行うためのアプレットを作成します.

-------------------------演習問題終了-------------------------

6.5 マルチスレッドとアニメーション

  Java には,スレッドと呼ばれる処理単位を複数同時に動作させる機能があります.詳細に関しては,次のプログラム例6.9 にしたがって説明します.なお,プログラム例6.9 は,通常のアプリケーションソフトウェアとして記述してあります.

(プログラム例6.9) マルチスレッド

  スレッドを作成する最も簡単な方法は,Java が提供している Thread クラスを継承することです.次の例は,この方法による簡単なプログラム例です.しかし,場合によっては,この方法を採用できない場合があります.例えば,アプレットを作成する場合,必ず Applet クラスを継承しなければならなず,かつ,多重継承ができないため,この方法を採用できません.その際に使用できる方法が Runnable インタフェースを利用することです( 7 行目).

  このプログラムでは,"***" と "---" という名前の 2 つのスレッドが生成され( 17,18 行目),それらがスタートすると,各スレッドは run メソッドに記述された内容(カウンタを 10 まで数える)を実行します.スレッドが実行されている間( 10 まで数え終わると各スレットは停止する),main では,while 文が実行されカウンタ k が増加していきます.このプログラムを実行すると,例えば,以下のような結果が得られます.なお,結果は,常にこのようになるわけではありません.状況によって実行順序は変化します.

  次のプログラムは,上の例を多少複雑にして,スレッドの実行順序を制御した場合の例です.最初のスレッド *** がスタートしカウントを始めますが,5 カウントしたところでスレッド --- の実行が終了するまで待ちます.そして,スレッド --- の実行終了後に再びカウントを継続します.

  このプログラムを実行すると以下のような結果が得られます.

  これ以降に示すのは,マルチスレッドを利用したアニメーションの例です.

(プログラム例6.10) 円の連続描画

  この例では,Java プログラム内で 100 MS 毎に図形(円)を描画することによってアニメーションを実現しています.ボタンをクリックすることによって,アニメーションの開始/停止を制御できます.以下に示すのが,その HTML ファイルと Java のソースプログラムです.

(プログラム例6.11) 図形の移動(単一図形)

  この例では,外部から読み込んだ画像を 33 ms 毎に,異なる位置に描画することによってアニメーションを実現しています.また,図形をクリックすると停止し,再度クリックすると再び動き出します.多少画面がちらつくかもしれませんが,これを解消するためにはバッファリング(たとえば,Graphics クラスの例参照)を行う必要があります.以下に示すのが,その HTML ファイルと Java のソースプログラムです.

(プログラム例6.12) 図形の移動(複数図形)

  この例では,複数の画像を読み込み,それらを異なった位置に順に表示することによってアニメーションを実現しています.以下に示すのが,その HTML ファイルと Java のソースプログラムです.

  上に示したソースファイルのA〜Dに入る数値または文字列を答えてください.

(プログラム例6.13) 画像メモリの操作

  この例では,画像メモリを直接操作してアニメーションを実現しています.以下に示すのが,その HTML ファイルと Java のソースプログラムです.

(プログラム例6.14) 簡単なシューティングゲーム

  このアプレットは,キーイベントを使用した簡単なゲームです.左右の矢印キーによって下中央に描かれた黒い矩形(砲台)を左右に動かすことができます.Shift キーをクリックするとレーザ砲が発射され,ターゲット(緑の円)に命中すると,ターゲットの色が一時的にピンクに変化し消滅します.また,ターゲットが,黒い矩形に当たるとゲームオーバになります.以下に示すのが,その HTML,及び,Java プログラムです.

  上に示した Java のソースファイルのA〜Dに入る数値または文字列を答えてください.

-------------------------演習問題開始-------------------------

  プログラム例6.14 で示したシミュレーションゲームを改善してみましょう.

-------------------------演習問題終了-------------------------

静岡理工科大学 総合情報学部 (by 菅沼) 菅沼ホーム 目次 5章