Microsoft社の「.net」環境を利用するC#の場合「VisualStudio」というソフトを使ってGUI部品をマウス操作で自由にウィンドウに配置してプロパティの値を設定してイベント処理用のメソッドにいろいろな処理の追加することでアプリケーション開発(以下GUI開発)が可能なのでオブジェクト指向言語の中では操作性が比較的高い言語といえるでしょう。
ただしC#は「プロパティ」というVisualStudioの機能でソースコードとGUI部品を関連付けしているため配列管理のGUI部品や実装と継承の区別がつかないなどの欠点があるのも事実です
ではJavaのGUI開発を考えてましょう。
Javaはテキストエディタ(例:メモ帳)で作成したクラスファイルをコマンドプロンプトで「javac クラス名.java」と入力してから「java クラス名」と実行すれば簡単にプログラムが動きます。
これはGUI開発も含めたJavaプログラミングの単純な開発方法でメジャーな部類だと思います
しかし、GUI開発の場合必ずといっていいほどコーディングする量が多い
(ゲームアプリやサーブレットのような複雑な処理をするものだと最低1000行くらい)
■Eclipse導入への考察
GUI開発になると「部品実装」・「処理」・「データ」の3つにクラスを分けるとつくりやすいです。
そこでGUI開発には「Eclipse」という統合開発環境ソフトを利用することを推奨します。
メリットは、
この3つはVisualStdioにもある機能なのでC#と使いやすさは同じように感じる(あくまで個人的意見)
デメリットは、
あくまで個人的感想なのですが使い慣れるとけっこう汎用性がたかくてGUI開発が楽しいです
■GUI開発でやること
Java API ライブラリにあるGUI用のクラス(GUI部品クラスをふくむ)2種類あります
java.awtパッケージ GUI部品 :C#やC++と同じ名前なのでなじぶかい
レイアウトマネージャ:このパッケージにしか存在しない。GUI部品の配置を設定するクラス
java.awt.eventパッケージ イベント処理用インタフェイス
javax.swingパッケージ GUI部品:awtパッケージのGUI部品をJava独自にのものにした完全にJavaで作られた
(awtのGUI部品はnaitive修飾子による他言語で作られているため)GUI部品クラス
awtパッケージ存在しない部品もある
つまり上記3パッケージのクラスを組み合わせて初めてGUIは動いています。
「awt」パッケージだけでもGUI開発ができますが、高度な処理(例:画像処理 etc)を目的としたGUI開発ではいくら高度なアルゴリズム考案しても実現できない場合があるためGUIの基本的な流れを理解するためなら良いが実用性を考えるなら「swing」パッケージ(J○○○のようなクラス名の部品)が
個人的にも好きなのでこのブログではJFrameを代表する[swing]ベースで進めます。
■JFrameクラス
JFrameクラスはウィンドウを表示する部品クラスで1番最初に表示する。
このクラスに各部品やレイアウトマネージャを追加して処理を実装することで誰もが知っているアプリケーションの形になります
コンストラクター
コンストラクター名 | 引数 | 説明 |
---|---|---|
JFrame() | なし | タイトルなしのウィンドウ(左上に何も表示されない)を生成する |
JFrame(String title) | タイトル名 | 左上に引数の文字列が表示されているウィンドウを生成する |
基本的にはこの2つだけでしょう(ほかにも2つコンストラクターがあるがおそらく使わない)
フィールド変数
変数名 | 説明 |
---|---|
DO_NOTHING_ON_CLOSE | 何もしない |
HIDE_ON_CLOSE | ウィンドウを非表示にする |
DISPOSE_ON_CLOSE | ウィンドウを非表示にして破棄する |
EXIT_ON_CLOSE | アプリケーションを終了する |
主にウィンドウの「x」ボタンに対する状態を表す変数でデフォルトで設定されている変数は「HIDE_ON_CLOSE」なので設定用メソッドで変更しないと
いつまでたってもプログラムが終了しないので注意したい。
設定用メソッド
メソッド名 | 引数 | 説明 |
---|---|---|
setTitle(String title) | タイトル名 | ウィンドウのタイトルを引数の文字列に変更 |
setSize(int width, int height) | 横幅、縦幅 | ウィンドウの幅を第1引数、高さを第2引数に変更する |
setVisible(boolean bo); | 表示フラグ | trueでウィンドウを表示する(falseで非表示) |
setDefaultCloseOperation (int status) | クローズオプション | 上記のフィールド変数表の変数を引数にしてウィンドウの閉じ方を設定 |
add(Compornent comp, Object constraints) | レイアウトマネージャを含む部品オブジェクト, レイアウトマネージャ | 第1引数のオブジェクトを第2引数に登録する |
setJMenubar(JMenuBar jbar) | JMenuBarオブジェクト(メニュ部品の集合) | ウィンドウにメニュを実装する |
JFrameという部品クラスは継承を繰り返すいわゆる孫継承の結果できたクラスなのでこの表にあるメソッドのような最低限の設定をする代表的な
メソッド以外にもやイベント処理用リスナー登録用メソッド 、クローズ用変数のよくわらないやつなどたくさんのオブジェクトがあるため
メソッドだけ見ても頻繁に利用しないものばかりなので表のに載っているGUI開発に必須なメソッドだけ使いこなせれば実用性の高いアプリケーションができると思う。
■GUI開発のためのコーディングルール(慣例として決まっているものではなく自己ルールなので深く考えないで!!)
まずクラスの定義
public class クラス名 extends JFrame implements インタフェイス名(必要なイベントリスナの数だけ){ }
mainメソッド 自クラスインスタンス生成(コンストラクターが自クラスのものなら型名はJFrameでもよい)
コンストラクター 部品クラスのインスタンス生成および実装
load()メソッド 部品の初期状態やフィールド変数の初期設定(*ゲームやファイル保存機能があるアプリケーションの場合初期化用メソッド)
フィールド変数 イベント処理でActionCommand()メソッドで部品を判別しないなら部品オブジェクトはフィールド変数で宣言したほうがよい
パネルオブジェクト 処理結果で配置が変更することがほとんどないのでprivate修飾やコンストラクタ内の変数
イベント処理メソッド コメント文(/* */)を利用して部品ごとの処理を隔離(if文の用途を区別)することで見やすくする。
ほかにもアクセス修飾子の細かい指定だとか外部ファイルだとかスレッドの場合の部品継承や部品配列は追々やります。
まとめ
なんだかいつもよ長く書いた気がする(JFrame分ければよかったかも・・・)