whichのブログ ~プログラミング体験記~ -17ページ目

whichのブログ ~プログラミング体験記~

主にJava,vVsual C#,Andoroid,SQLについて
覚え基本た文法やプログラミング技法、各クラスの利用法を
忘れないように形にしたものです

初心者だとかプロだとか特に意識せず利用してもらえるとうれしいです。

■GUIのための開発環境
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」という統合開発環境ソフトを利用することを推奨します。
メリットは、
  • クラス生成の自動化     ← パッケージの作成を同時に実行できるので効率的にクラスを管理できる
  • 予測変換機能付き       ← APIのクラスの中でもGUI系のメソッドやフィールドは名前が長かったり、似たような名前が                                          多いため便利
  • 自動コンパイル       ← デバックの際エラーに対して修正候補をリストアップしてくれる
  • 実行可能フファイル作成 ← 「.exe」形式にすることで他のアプリケーションと同等の実行環境で使える

  • この3つはVisualStdioにもある機能なのでC#と使いやすさは同じように感じる(あくまで個人的意見)

    デメリットは、
  • 外部ファイルのパスが複雑 ← 画像や読み込みファイルはソースコードと別のディレクトリに保存されるため
  • 処理が重い(遅い)      ← 起動に5分以上かかることもある
  • 他の環境で作成したソースコードを「インポート」で読み込むと文字列リテラル(文字列型の値)がたまに文字化けする

  • あくまで個人的感想なのですが使い慣れるとけっこう汎用性がたかくて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分ければよかったかも・・・)