検索
連載

EclipseによるSWTアプリケーションの作成Eclipse徹底活用(7)(2/4 ページ)

Share
Tweet
LINE
Hatena

SWTアプリケーションを作る

 ここからは、いよいよSWTを使用した開発を実践的に解説していきます。

作成するアプリケーション

 今回はSWTのアプリケーションとして、CSVファイルを表形式で表示するCSVViewerを作成します。CSVViewerの概観は、以下のようになります。

CSVViewerの概観

 このアプリケーションの仕様は、以下のとおりです。

  • メニューから、読み込むファイルの選択と、アプリケーションの終了を行える
  • 読み込んでいるファイル名を、テキストボックスに表示する
  • CSVファイルの内容は、テーブルを使用して表示する。列名は「列1」「列2」…とCSVファイルの最大列数分だけ表示する
  • 現在の状況を表示するためのステータスバーを設ける
    • テーブル内の行を選択した際に、行番号を表示する
    • ファイルの読み込みにかかった時間を表示する

 ここでは、以下の順番でアプリケーションの作成を行います。

(1) シェル(ウィンドウ)の生成
(2) シェルへのウィジェット(GUIコンポーネント)の配置
(3) CSV読み込み、表示処理の実装
(4) ウィジェットへのイベントリスナーの登録(処理の追加)


シェル(ウィンドウ)の生成

 まずここでは、ウィンドウを表示できるところまで完成させます。

 Eclipseのメニューから、[ファイル]->[新規]->[クラス]で新規Javaクラスダイアログを開きます。以下のとおり入力して、[終了]ボタンをクリックします。

ソース・フォルダ swtPrj/src
パッケージ名 csvviewer
名前 CSVViewer

 Eclipseが生成したコードを以下のように編集します。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 一般的なSWTアプリケーションの処理の流れは、次のようになります(番号はコード中の番号に対応しています)。

(1) SWTセッションを表すDisplayオブジェクトを生成
(2) アプリケーションのメイン・ウィンドウとなる1つ以上のShellを生成
(3) ウィンドウ内で必要となる他のウィジェットを生成
(4) ウィジェットのサイズや、その他の必要な状態を初期化
(5) 処理を実行する必要のあるウィジェットにリスナーを登録
(6) Shellを開く
(7) メイン・ウィンドウが破棄されるまで、DisplayオブジェクトのreadAndDispatchメソッドとsleepメソッドでループ
(8) メイン・ウィンドウが破棄されたら、Displayオブジェクトを破棄


 ここまでのCSVViewerでは、上記のうち(1)、(2)、(6)、(7)、(8)を実装しています。上記のソースコードにコメントとして記述されている番号と見比べてください。

 CSVViewerのソースが選択されている状態で、Eclipseのメニューから「実行」->「次を実行」->「Javaアプリケーション」を選択すると、プログラムを実行できます。以下のようなウィンドウが表示されます。

表示されたウィンドウ

 アプリケーションとしてはこれ以上何もできませんので、CSVViewerのタイトルバー上の「×」ボタンをクリックし、終了してください。

 ここまでのソースは、ここからダウンロードしてください(ファイル名、クラス名を変えています)。

シェルへのウィジェット(GUIコンポーネント)の配置

 次に、「(3)ウィンドウ内で必要となるほかのウィジェットを生成」と「(4)ウィジェットのサイズや、そのほかの必要な状態を初期化」を実装します。

 以下では、修正個所ごとに説明を行います。変更した行は強調表示してあります。

インスタンス変数の追加

 後で別のメソッドから操作されるウィジェットは、インスタンス変数に宣言しておきます。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 textBox、table、statusBar、mItemOpenを宣言しました。

GridLayoutの指定

 CSVViewerのopenメソッド内で、ウィジェットを生成する前に、shellに対しGridLayoutを指定します。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 GridLayoutのコンストラクタの引数numColumnsに1を指定したので、shellに追加されるウィジェットは、縦1列に並べられます。

Compositeの生成

 shellの設定の次に、テキストボックスとテーブルを配置するためのCompositeを生成します。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 CompositeにはShell同様、GridLayoutを指定します。

 また、GridDataを設定し、親ウィジェットとなるShellのGridLayoutに対して幅全体、高さ全体に広がった配置が行われるようにしています。

テキストボックスの生成

 Compositeを生成した後、単一行のテキストボックスを作成します。親ウィジェットには先ほど作成したCompositeを指定します。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 単一行であるか、複数行であるかは、生成時にコンストラクタのstyleというフラグで指定します。さらに今回はボーダー(ふち)を付けるようにBORDERを指定しました。フラグは、ビット演算子「|」で複数指定することができます。

 また、GridDataを設定し、親ウィジェットとなるCompositeのGridLayoutに対して幅全体に広がった配置が行われるようにしています。

テーブルの作成

 テキストボックスに続いて、CSVファイルのデータを表示するためのテーブルを生成します。親ウィジェットには、Compositeを指定します。

 複数列を扱うMULTI、テーブル内の行を選択した際、1行全体が選択されるようにするFULL_SELECTION、ボーダーを付けるようにBORDERを指定しています。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 また、GridDataを設定し、親ウィジェットとなるCompositeのGridLayoutに対して幅全体、高さ全体に広がった配置が行われるようにしています。

 罫線を表示するためのsetLinesVisibleメソッド、列のヘッダを表示するためのsetHeaderVisibleメソッドを呼んでいます。

 また、列のヘッダの設定を行います。ここで設定するのはCSVファイルを読み込んでいない状態で表示されるテーブルなので、取りあえず1列分だけ設定します。

ステータスバーの作成

 SWTではステータスバーというウィジェットは存在しないので、文字を表示するラベルを設定します。親ウィジェットにShellを指定します。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 GridDataを設定し、親ウィジェットとなるShellのGridLayoutに対して幅全体に広がった配置が行われるようにしています。

メニューの作成

 MenuBarをShellに設定し、その子要素として以下の親子関係を持つメニューを作成します。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 MenuItem([ファイル])には、子要素としてメニューを持たせるためのCASCADEを指定します。MenuItem([開く])、MenuItem([終了])は、選択したときにイベントを発生させるためのPUSHを指定します。

 ここまでのソースファイルはここから入手できます(ファイル名、クラス名を変えています)。

 Eclipse上のメニューから[実行]->」前回の起動を[実行]を選択(又はキーボードから[Ctrl + F11]を入力)すると、以下のようなウィンドウが表示されます。

表示されたウィンドウ

 必要なウィジェットが配置され、アプリケーションらしくなってきました。ウィンドウのサイズを変更し、GridDataが期待どおりのレイアウトを行うかどうか確認してください。

 しかし、ここまでのCSVViewerでは[開く]や[終了]メニューを選択しても何も起こりません。CSVViewerのタイトルバー上の[×]ボタンをクリックし、終了してください。

CSV読み込み、表示処理の実装

 次のCSVViewerでは、「(5)処理を実行する必要のあるウィジェットにリスナーを登録」を実装し、メニューを選択したときの処理を追加していきます。まずは処理の実装から行います。

 引き続き、修正個所ごとに説明していきます。

インスタンス変数の追加

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 CSVファイル名を代入するfileNameと、ファイルダイアログを使用する際のフィルタ拡張子のEXTENSIONS、読み込み時間測定のためのbeginTimeを宣言します。

テーブルの作成部をメソッド化

 メニューを呼び出したときにもテーブルを再作成する処理を行うため、テーブルの作成部をメソッドとして抽出し、コードの重複を防ぎます。

 openメソッド内の該当個所をドラッグして選択し、Eclipseのメニューから[リファクタリング]->[メソッドの抽出]を選択します。メソッド名に「createTable」と入力し、[OK]をクリックします。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

ファイル名の取得処理の実装

 ファイルダイアログを開き、ファイル名を入手する処理を実装します。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

CSVファイル読み込み前の処理の実装

 ファイル名を取得後、実際に読み込み処理に入る前の処理を実装します。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 ファイル読み込み中は、新たにファイルの読み込みを始められないように、[開く]メニューを選択不可にします。

 SWTのテーブルでは、一度設定したカラムは破棄することができません。そのため、テーブル自体を再作成しています。テーブルの再作成には、先ほど抽出したcreateTableメソッドを呼び出します。

 テキストボックスとステータスバーの表示を変え、読み込み時間測定用に現在の時間をSystem.currentTimeMillisメソッドで取得します。

CSVファイル読み込み処理の実装

 ファイル名が存在した場合、カンマ区切りでデータを読み込み、テーブルにセットしていきます。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 BufferedReaderを使用して1行ごとにファイルから読み込みます。カンマで区切る処理はJDK1.4から使用できるsplitメソッドを使用しています。

 また、現在テーブルが持つ列数よりも読み込んだデータの列数の方が多かった場合、差分をカラムとして追加しています。

 テーブルへのデータの追加は、TableItemオブジェクトを生成することで実現できます。TableItemオブジェクトのsetTextメソッドを使用し、読み込んだ値を設定します。

 最後にfinally句で、BufferedReaderをcloseします。

CSVファイル読み込み後の処理の実装

 ファイル読み込み後の処理を実装します。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 前処理で実施した、[開く]メニューの無効化を解除します。また、ステータスバーに、読み込み処理にかかった時間をミリ秒で表示します。

終了処理の実装

 [終了]メニュー実行時に呼び出される終了処理を実装します。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

選択行の表示処理の実装

 テーブル内の行を選択した際に、行番号をステータスバーに表示するための処理を実装します。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 以上で必要な処理が実装できました。

Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る