NetBeans IDE 5.0 リッチクライアントアプリケーション開発入門
NetBeans IDE 5.0 リッチクライアントアプリケーション開発入門
このドキュメントでは、NetBeans Platform 上でリッチクライアントアプリケーションを開発するための、NetBeans IDE 5.x の基本的な使い方を説明します。 NetBeans Platform 上でアプリケーションを開発するときは、NetBeans IDE のコアで開発を行います。 IDE に属するモジュールで、アプリケーションと関連のないものはすべて削除されますが、役に立つものは保持されます。 IDE のコアですぐに使える機能を再利用することで、多くの時間と労力を節約できます。
このチュートリアルは、できるだけ短時間で作業に取り組めるように作られています。 ここでは、NetBeans Platform 上で簡単なアプリケーションを作成してインストールします。 このアプリケーションを使用することによって、次のように画面に絵を描き、その結果を保存することができます。
この初期バージョンは決して本格的な描画アプリケーションではありませんが、NetBeans Platform 上でアプリケーションを作成する簡単な例を具体的に紹介します。
リッチクライアントアプリケーションではなく、NetBeans プラグインモジュールについて学ぶ場合は、チュートリアル NetBeans IDE モジュール開発入門 を参照してください。
描画アプリケーションの設定
この節では、アプリケーションの構造を作成します。 まず、アプリケーションを表すモジュールスイートプロジェクトを作成する必要があります。 このアプリケーションはライブラリに依存するので、そのライブラリの JAR ファイルを含むライブラリラッパーモジュールプロジェクトを作成します。 最後に、コードを含むモジュールプロジェクトを作成します。
モジュールスイートの作成
モジュールスイートはアプリケーションに相当するもので、特定の結果を作成するために一緒になって機能する一連のモジュールです。 また、使用する独自のスプラッシュ画面 (ブランディング)、アプリケーション名、および NetBeans モジュールの種類と数の割り当ても行います。 配布用 ZIP の作成、Java WebStart (JNLP) アプリケーションの構築といったアクションを利用することもできます。こうしたアクションは、アプリケーションをほかのユーザーが利用できるようにするための重要なツールです。
「ファイル」>「新規プロジェクト」を選択します。 「カテゴリ」で「NetBeans プラグインモジュール」を選択します。 プロジェクトで「モジュールスイートプロジェクト」を選択し、「次へ」をクリックします。
「名前と場所」パネルの「プロジェクト名」に「PaintApp 」と入力します。 「プロジェクトの場所」を、使用しているコンピュータ上の任意のディレクトリに変更します。 「主プロジェクトとして設定」チェックボックスが選択されていることを確認します。
「完了」をクリックします。
IDE で新しいモジュールスイートプロジェクトが開きます。 「プロジェクト」ウィンドウにはノードが 1 つ含まれています。 この「モジュール」ノードは、モジュールスイートプロジェクトにモジュールプロジェクトおよびライブラリラッパーモジュールプロジェクトを手動で追加するためのものです。 「モジュールプロジェクト」ウィザードまたは「ライブラリラッパーモジュールプロジェクト」ウィザードを使用すると、作成するモジュールが自動的にモジュールスイートプロジェクトに追加されます。
ライブラリラッパーモジュールプロジェクトの作成
ライブラリラッパーモジュールは、JAR ファイルにコードが一切含まれないモジュールで、ライブラリへの単なるポインタです。 これによってライブラリが NetBeans モジュールに変換されると、元の JAR ファイルを変更しなくても、NetBeans クラスローダーシステムのすべての保護が適用されます。 その結果、アプリケーションは別の NetBeans モジュールに依存する場合と同じように、そのライブラリに依存することができます。 また、このライブラリの新しいバージョンが利用できるようになった場合、ラッパーライブラリ用の NetBeans モジュール (NBM) ファイルを 1 つ配布するだけで、新しいバージョンの配布が可能になります。
NetBeans Platform 上で構築を行う利点の 1 つは、ユーザーインタフェースが、Java の標準ユーザーインタフェースツールキットである Swing に基づいていることです。 Swing は長い間使われてきたので、アプリケーションに再利用できる Swing コンポーネントが数多くそろっています。 このチュートリアルでは、既存のカラーチューザ JavaBeans (ソースコードは contrib/coloreditor 下の NetBeans CVS 内にある) を再利用します。 ColorChooser.jar という名前の JAR ファイルです。 ファイルはここ からダウンロードできます。 これをファイルシステム内の任意の場所に保存します。 次の手順に従って、ColorChooser.jar ファイルのためのライブラリラッパーモジュールを作成します。
「ファイル」>「新規プロジェクト」を選択します。 「カテゴリ」で「NetBeans プラグインモジュール」を選択します。 プロジェクトで「ライブラリラッパーモジュールプロジェクト」を選択し、「次へ」をクリックします。
「名前と場所」パネルの「ライブラリ」で、ColorChooser.jar をダウンロードした場所に移動します。
「ライセンス」テキストフィールドは空のままにしておきます。 最終成果物の配布を予定している場合は、外部ライブラリのライセンスファイルを指定するようにします。
「次へ」をクリックし、もう一度「次へ」をクリックしてから「完了」をクリックします。
モジュールプロジェクトの作成
次に、これから作成する実際のコードを含めるモジュールが必要になります。
「ファイル」>「新規プロジェクト」を選択します。 「カテゴリ」で「NetBeans プラグインモジュール」を選択します。 プロジェクトで「モジュールプロジェクト」を選択し、「次へ」をクリックします。
「名前と場所」パネルの「プロジェクト名」に「Paint 」と入力します。 「プロジェクトの場所」を、使用しているコンピュータ上の任意のディレクトリに変更します。 「モジュールスイートに追加」ラジオボタンが選択され、「モジュールスイート」ドロップダウンリストで PaintApp モジュールスイートが選択されていることを確認します。 「主プロジェクトとして設定」チェックボックスを選択します。 「次へ」をクリックします。
「基本モジュール構成」パネルで、「コード名ベース」の yourorghere を netbeans に変え、全体の名前を org.netbeans.paint にします。 「モジュール表示名」は Paint のままにしておきます。 ローカライズのバンドルおよび XML レイヤーはそのままにしておきます。これらは org.netbeans.paint という名前のパッケージに格納されます。 これらのファイルには、次の役割があります。
ローカライズのバンドル。 国際化のための言語固有の文字列を指定します。
XML レイヤー。 NetBeans システムにメニューやツールバーボタンなどの項目を登録します。
「完了」をクリックします。
IDE によって Paint プロジェクトが作成されます。 このプロジェクトには、ソースや、プロジェクトの Ant 構築スクリプトなどのプロジェクトメタデータがすべて含まれます。 IDE でプロジェクトが開きます。 「プロジェクト」ウィンドウ (Ctrl-1) でプロジェクトの論理構造を、「ファイル」ウィンドウ (Ctrl-2) でそのファイル構造を見ることができます。 たとえば、「プロジェクト」ウィンドウは次のように表示されます。
プロジェクトには、ローカライズのバンドルと XML レイヤーに加えて、次の重要なファイルも含まれます。
モジュールのマニフェスト。 プロジェクトがプラグインモジュールであることを宣言します。 また、XML レイヤーの場所、ローカライズのバンドルの場所、およびモジュールのバージョンなど、モジュール固有の情報も設定します。
構築スクリプト。 nbproject/build-impl.xml 内の指定よりも優先される、独自の Ant ターゲットをここに作成できます。
プロジェクトメタデータ。 プロジェクトの種類、内容、プラットフォーム、クラスパス、依存関係、プロジェクトのコマンドと Ant スクリプト内のターゲットのマッピングなどの情報が含まれます。
このチュートリアルでは、これらのファイルを変更する必要はありません。
モジュールプロジェクトの依存関係の指定
NetBeans API に属するいくつかのクラスをサブクラス化する必要があります。 また、このプロジェクトは ColorChooser.jar ファイルに依存します。 すべての NetBeans API はプラグインモジュールによって実装されます。そのため、これらの作業の両方を完了することは、プラグインモジュールの実行に必要なプラグインモジュールの一覧にいくつかのプラグインモジュールを追加することを意味します。
「プロジェクト」ウィンドウでPaint プロジェクトノードを右クリックし、「プロパティー」を選択します。 「プロジェクトプロパティー」ダイアログで「ライブラリ」をクリックします。
次の API のそれぞれについて、「追加...」をクリックし、サブクラス化するクラスの名前の入力を開始します。 入力が進むと、クラスを提供できる NetBeans API の数が絞り込まれ、そのクラスを提供できるものだけが「モジュール」リストに表示されます。
次の表の最初の列は、このチュートリアルでサブクラス化するすべてのクラスの一覧を示しています。 それぞれについて、クラス名を入力し始めると「モジュール」リストの表示が絞り込まれます。 下の表の 2 番目の列を使用して、絞り込まれた「モジュール」リストから適切な API (または、ColorChooser の場合はライブラリ) を選択し、選択を確認するために「了解」をクリックします。
クラス
API
目的
ColorChooser
ColorChooser
作成したカラーチューザコンポーネントのためのライブラリラッパーモジュール
DataObject
データシステム API
DataObject クラスを含む NetBeans モジュール
DialogDisplayer
ダイアログ API
ユーザー通知の作成、ダイアログの説明、およびその表示を可能にします
AbstractFileObject
ファイルシステム API
一定の方法でファイルにアクセスする共通の API を提供します
AbstractNode
ノード API
NetBeans 内のオブジェクトを視覚化する主機構として機能します
StatusDisplayer
UI ユーティリティー API
メインウィンドウのステータスバーの作成に使用されるStatusDisplayer クラス
WeakListeners
ユーティリティー API
WeakListners クラスを含みます
TopComponent
ウィンドウシステム API
TopComponent JPanel クラスを含みます
「了解」をクリックして、「プロジェクトプロパティー」ダイアログを終了します。
「プロジェクト」ウィンドウで「重要なファイル」ノードを展開し、「プロジェクトメタデータ」ノードをダブルクリックして、選択した API がモジュールの依存関係として宣言されていることを確認します。
キャンバスの作成
次の手順では、ユーザーが描画する実際のコンポーネントを作成します。 ここでは、純粋な Swing コンポーネントを使用するため、その実装の詳細は省略し、最終バージョンを提供するにとどめます。 ライブラリラッパーモジュールを作成したカラーチューザ Bean が、このパネルのソースコードに使用されます。完成したアプリケーションを実行すると、画像編集用パネルのツールバーでこのカラーチューザ Bean を確認できます。
「プロジェクト」ウィンドウで Paint ノード、「ソースパッケージ」ノードを順に展開し、org.netbeans.paint ノードを右クリックします。 「新規」>「Java クラス」を選択します。
クラス名として「PaintCanvas 」と入力します。 「パッケージ」の一覧に org.netbeans.paint があることを確認します。 「完了」をクリックします。 ソースエディタで PaintCanvas.java が開きます。
このファイルのデフォルトの内容をここ に示す内容で置き換えます。 パッケージに org.netbeans.paint 以外の名前を付けた場合は、ソースエディタでパッケージ名を訂正します。
モジュールの実装
ここでは、NetBeans API を利用する最初のクラスを作成します。 それは TopComponent クラスです。 TopComponent クラスは、NetBeans のウィンドウシステムで操作可能な JPanel クラスであり、メインウィンドウのタブ付きコンテナ内に配置できます。
TopComponent クラスの準備
「プロジェクト」ウィンドウで Paint ノード、「ソースパッケージ」ノードを順に展開し、org.netbeans.paint ノードを右クリックします。 「新規」>「Java クラス」を選択します。
クラス名として「PaintTopComponent 」と入力します。 「パッケージ」の一覧に org.netbeans.paint があることを確認します。 「完了」をクリックします。 ソースエディタに PaintTopComponent.java が表示されます。
このファイルの最上部近くにあるクラス宣言を次のように変更します。
public class PaintTopComponent extends TopComponent implements ActionListener, ChangeListener {
インポートを修正するには、Alt-Shift-F キーを押します。 このファイルの最上部にある、必要なインポートパッケージの宣言は IDE によって行われます。
入力したクラス宣言の下に赤い波線が表示されます。 その行にカーソルを置くと、左側の余白部分に電球のアイコンが表示されます。 電球アイコンをクリックする (またはAlt-Enter キーを押す) と、次のように表示されます。
「すべての抽象メソッドを実装」を選択します。 IDE によって、2 つのメソッド actionPerformed() および stateChanged() のスケルトンが生成されます。 このチュートリアルではのちほど、これらの記述を行います。
次の 3 つの変数の宣言を PaintTopComponent クラスの最上部に追加し、インポート文を修正します (Alt-Shift-F キー)。
private PaintCanvas canvas = new PaintCanvas(); //ユーザーが描画するコンポーネント
private JComponent preview; //ペイントブラシサイズを示すツールバーのコンポーネント
private static int ct = 0; //新しい画像の名前を用意するために使用するカウンタ
今度は、2 つのボイラープレートメソッドを実装する必要があります。 1 つは、アプリケーションの停止時に、開いているすべてのウィンドウを無視するようにウィンドウシステムに指示するものです。もう 1つは、コンポーネントの一意の文字列 ID 用のベース文字列を提供するものです。 各 TopComponent には、TopComponent を保存する時に使用される一意の文字列 ID があります。 次の 2 つのメソッドを PaintTopComponent クラスに挿入します。
public int getPersistenceType() {
return PERSISTENCE_NEVER;
}
public String preferredID() {
return "Image";
}
TopComponent クラスの初期化
IDE がクラスの最上位近くに作成したコンストラクタに入力して、インポート文を修正します (Alt-Shift-F キー)。
public PaintTopComponent() {
initComponents();
String displayName = NbBundle.getMessage(
PaintTopComponent.class,
"UnsavedImageNameFormat",
new Object[] { new Integer(ct++) }
);
setDisplayName(displayName);
}
このコードは非常に簡潔です。 最初の呼び出しは、まだ作成されていないメソッド、initComponents() に対するものです。このメソッドはツールバーおよび PaintCanvas を TopComponent に追加します。 このメソッドはまだ作成されていないので、その下に赤い波線が表示されています。 先ほどと同じように、電球アイコンをクリックし (または Alt-Enter キーを押し)、提案を受け入れます。
initComponents() メソッドのスケルトンが生成されます。
「プロジェクト」ウィンドウで org.netbeans.paint パッケージを展開します。 Bundle.properties ファイルをダブルクリックして、ソースエディタで開きます。 最後の部分に次の行を追加します。
UnsavedImageNameFormat=Image {0}
先に進む前に、このファイルを保存します。
スケルトンメソッドの記述
initComponents() メソッドでコンポーネントをパネルにインストールすると、ユーザーが対話できます。 前の節で、そのスケルトンメソッドを作成しました。 そこに、次のように記述します。
private void initComponents() {
setLayout(new BorderLayout());
JToolBar bar = new JToolBar();
ColorChooser fg = new ColorChooser();
preview = canvas.createBrushSizeView();
//ツールバーを構築
//コンポーネントがつぶれないようにする
Dimension min = new Dimension(32, 32);
preview.setMaximumSize(min);
fg.setPreferredSize(new Dimension(16, 16));
fg.setMinimumSize(min);
fg.setMaximumSize(min);
JButton clear = new JButton(
NbBundle.getMessage(PaintTopComponent.class, "LBL_Clear"));
JLabel fore = new JLabel(
NbBundle.getMessage(PaintTopComponent.class, "LBL_Foreground"));
fg.addActionListener(this);
clear.addActionListener(this);
JSlider js = new JSlider();
js.setMinimum(1);
js.setMaximum(24);
js.setValue(canvas.getDiam());
js.addChangeListener(this);
fg.setColor(canvas.getColor());
bar.add(clear);
bar.add(fore);
bar.add(fg);
JLabel bsize = new JLabel(
NbBundle.getMessage(PaintTopComponent.class, "LBL_BrushSize"));
bar.add(bsize);
bar.add(js);
bar.add(preview);
JLabel spacer = new JLabel(" "); //ブラシプレビューが
//ツールバーの端まで広がらない
//ようにするスペーサ
spacer.setPreferredSize(new Dimension(400, 24));
bar.add(spacer);
//ツールバーおよび描画処理コンポーネントを配置
add(bar, BorderLayout.NORTH);
add(canvas, BorderLayout.CENTER);
}
Alt-Shift-F キーを押し、必要なインポート文を生成します。
生成した 2 つのメソッドにコードを記述します。 これらのメソッドは、PaintTopComponent クラスの監視に使用されます。
public void actionPerformed(ActionEvent e) {
if (e.getSource() instanceof JButton) {
canvas.clear();
} else if (e.getSource() instanceof ColorChooser) {
ColorChooser cc = (ColorChooser) e.getSource();
canvas.setPaint (cc.getColor());
}
preview.paintImmediately(0, 0, preview.getWidth(), preview.getHeight());
}
public void stateChanged(ChangeEvent e) {
JSlider js = (JSlider) e.getSource();
canvas.setDiam (js.getValue());
preview.paintImmediately(0, 0, preview.getWidth(), preview.getHeight());
}
Bundle.properties ファイルの末尾に、次のキーと値を追加します。
LBL_Clear = Clear
LBL_Foreground = Foreground
LBL_BrushSize = Brush Size
先に進む前に、このファイルを保存します。
ディスクへの画像の保存
次のコードを PaintTopComponent クラスに挿入します。
public void save() throws IOException {
if (getDisplayName().endsWith("_ja.png")) {
doSave(new File(getDisplayName()));
} else {
saveAs();
}
}
public void saveAs() throws IOException {
JFileChooser ch = new JFileChooser();
if (ch.showSaveDialog(this) == JFileChooser.APPROVE_OPTION && ch.getSelectedFile() != null) {
File f = ch.getSelectedFile();
if (!f.getPath().endsWith("_ja.png")) {
f = new File(f.getPath() + "_ja.png");
}
if (!f.exists()) {
if (!f.createNewFile()) {
String failMsg = NbBundle.getMessage(
PaintTopComponent.class,
"MSG_SaveFailed", new Object[] { f.getPath() }
);
JOptionPane.showMessageDialog(this, failMsg);
return;
}
} else {
String overwriteMsg = NbBundle.getMessage(
PaintTopComponent.class,
"MSG_Overwrite", new Object[] { f.getPath() }
);
if (JOptionPane.showConfirmDialog(this, overwriteMsg)
!= JOptionPane.OK_OPTION) {
return;
}
}
doSave(f);
}
}
private void doSave(File f) throws IOException {
BufferedImage img = canvas.getImage();
ImageIO.write(img, "png", f);
String statusMsg = NbBundle.getMessage(PaintTopComponent.class,
"MSG_Saved", new Object[] { f.getPath() });
StatusDisplayer.getDefault().setStatusText(statusMsg);
setDisplayName(f.getName());
}
Bundle.properties ファイルに次の行を追加します。
MSG_SaveFailed = Could not write to file {0}
MSG_Overwrite = {0} exists. Overwrite?
MSG_Saved = Saved image to {0}
先に進む前に、このファイルを保存します。
Alt-Shift-F キーを押し、インポート文を修正します。
メニュー項目の作成
モジュールの機能の基礎を作成するには、NetBeans のプラグインモジュールのファイルテンプレートを使用します。 ファイルテンプレートを使用すると、作成した項目が IDE によって layer.xml ファイルに登録されます。 ウィザードを使用してファイルテンプレートを作成したら、NetBeans API を参考にしてモジュールの開発を続けます。
新しいキャンバスアクションの定義
「プロジェクト」ウィンドウでプロジェクトノードを右クリックし、「新規」>「ファイル/フォルダ」を選択します。 「新規ファイル」ウィザードで、「カテゴリ」から「NetBeans モジュール開発」、「ファイルの種類」から「アクション」を選択します。 「次へ」をクリックします。
「アクションの種類」パネルで、デフォルト値をそのまま使用します。 「次へ」をクリックします。
「GUI の登録」パネルで、「大域メニュー項目」を選択し、「大域ツールバーボタン」を選択します。 次の値を設定します。
カテゴリ: 編集
メニュー: ファイル
位置: <セパレータ> - ここに置く - プロジェクトを開く...
ツールバー: ファイル
位置: ここに置く - 新規ファイル
注: 「ファイル」メニュー内および「ファイル」ツールバー内であれば、アクションはどこに置いてもかまいません。
「大域メニュー項目」セクションで、「セパレータを前に」を選択します。
画面は次のようになります。
「次へ」をクリックします。
「名前、アイコン、および場所」パネルで、「クラス名」に「NewCanvasAction 」と入力し、「表示名」に「New Canvas 」と入力します。
「アイコン」に次のアイコンをペーストします (ここでアイコンを右クリックし、org.netbeans.paint フォルダに保存)。
「完了」をクリックします。
NewCanvasAction.java が org.netbeans.paint 内に作成され、ソースエディタ内で開かれます。 次のソースが表示されます (リンクをクリックすると、関連する NetBeans API Javadoc が表示される)。
package org.netbeans.paint;
import org.openide.util.HelpCtx ;
import org.openide.util.actions.CallableSystemAction ;
public final class NewCanvasAction extends CallableSystemAction {
public void performAction() {
// TODO implement action body
}
public String getName() {
return NbBundle.getMessage(NewCanvasAction.class, "CTL_NewCanvasAction");
}
protected String iconResource() {
return "org/netbeans/paint/newCanvas_ja.gif";
}
public HelpCtx getHelpCtx() {
return HelpCtx.DEFAULT_HELP;
}
protected boolean asynchronous() {
return false;
}
}
「GUI の登録」パネルで指定したように、アクションのクラスが IDE によってメニュー項目およびツールバーボタンとして layer.xml ファイルに登録されます。
ソースエディタで NewCanvasAction.java を開き、performAction() メソッドを次のように記述します。
public void performAction() {
PaintTopComponent tc = new PaintTopComponent();
tc.open();
tc.requestActive();
}
これを実行すると、画像編集コンポーネントの新しいインスタンスが作成され、メインウィンドウ内に開かれます。さらに、キーボードフォーカスが移動されてそのタブが選択され、有効化されます。
保存アクションの定義
「プロジェクト」ウィンドウでプロジェクトノードを右クリックし、「新規」>「ファイル/フォルダ」を選択します。 「新規ファイル」ウィザードで、「カテゴリ」から「NetBeans モジュール開発」、「ファイルの種類」から「アクション」を選択します。 「次へ」をクリックします。
「アクションの種類」パネルで、デフォルト値をそのまま使用します。 「次へ」をクリックします。
「GUI の登録」パネルで、「大域メニュー項目」を選択し、「大域ツールバーボタン」を選択します。 次の値を設定します。
カテゴリ: 編集
メニュー: ファイル
位置: <instance of NewCanvasAction> - ここに置く - HTML にプリント...
ツールバー: ファイル
位置: <instance of NewCanvasAction> - ここに置く - 新規ファイル
注: 「ファイル」メニュー内および「ファイル」ツールバー内であれば、アクションはどこに置いてもかまいません。
「大域メニュー項目」セクションで、「セパレータを後に」を選択します。
「次へ」をクリックします。
「名前、アイコン、および場所」パネルで、「クラス名」に「SaveCanvasAction 」と入力し、「表示名」に「Save Canvas 」と入力します。
「アイコン」に次のアイコンをペーストします (ここでアイコンを右クリックし、org.netbeans.paint フォルダに保存)。
「完了」をクリックします。
SaveCanvasAction.java が org.netbeans.paint 内に作成され、ソースエディタに表示されます。
ソースエディタで、SaveCanvasAction.java を開き、performAction() メソッドを次のように記述します。
public void performAction() {
TopComponent tc = TopComponent.getRegistry().getActivated();
if (tc instanceof PaintTopComponent) {
try {
((PaintTopComponent) tc).saveAs();
} catch (IOException ioe) {
ErrorManager.getDefault().notify(ioe);
}
} else {
//メニュー項目またはツールバーボタンを押してから
//アクションが呼び出されるまでの間に、アクティブな
//コンポーネントは変わることがある。 可能性は低いが、
//理論上は可能
Toolkit.getDefaultToolkit().beep();
}
}
Alt-Shift-F キーを押し、必要なインポート文を生成します。
クラスの宣言を変更して、プロパティー変更リスナーを追加します。
public final class SaveCanvasAction extends CallableSystemAction implements PropertyChangeListener {
ふたたび赤い波線が表示されます。 Alt-Enter キーを押して電球アイコンを表示させ、提案を選択します。
ふたたび赤い波線が表示されます。 同様の処理を繰り返し、提案を受け入れます。
生成されたpropertyChange() メソッドに次のコードを追加します。
public void propertyChange(PropertyChangeEvent evt) {
if (TopComponent.Registry.PROP_ACTIVATED.equals(evt.getPropertyName())){
updateEnablement();
}
}
次に、updateEnablement() メソッドを次のように定義します。
private void updateEnablement() {
setEnabled(TopComponent.getRegistry().getActivated()
instanceof PaintTopComponent);
}
最後に、コンストラクタを次のように定義します。
public SaveCanvasAction() {
TopComponent.getRegistry().addPropertyChangeListener (
WeakListeners.propertyChange(this,
TopComponent.getRegistry()));
updateEnablement();
}
特に興味深いのは、プロパティー変更リスナーを追加するコードです。 TopComponent.Registry は、システムで開かれているすべての TopComponent のレジストリ、つまり、開かれているすべてのタブのレジストリです。 ここで行いたいのは、その変更の待機と、フォーカスのある対象に応じた、アクションの有効化および無効化です。
ここでは、プロパティー変更リスナーを直接接続するのではなく、WeakListeners.propertyChange() を呼び出しています。 そうすることによって、アクションを弱参照するプロパティー変更リスナーが生成されます。 実際には、アプリケーションが開かれている限りこのアクションは存続します。リスナーを接続していて、切り離すコードが存在しない場合は、弱参照リスナーを使用するほうが良く、また将来の保証があります。 そうでない場合、メモリーリークが発生する可能性があります。レジストリがリスナーのリスト内にアクションの参照を保持しているため、アクションに対するガベージコレクションが行われません。
「プロジェクト」ウインドウには、次のように表示されます。
これで、機能するモジュールができあがりました。 「プロジェクト」ウィンドウで PaintApp ノードを右クリックし、「実行」を選択します。 インストールしたモジュールと共に NetBeans IDE のコピーが表示されます。
最後の仕上げ
もちろん、作成するのはアプリケーションであって、IDE ではありません。そのために最終手順をいくつか実行します。 まず、アプリケーション用のスプラッシュ画面を作成し、次に、不要なモジュールを削除します。最後に、配布用 ZIP および JNLP アプリケーションを作成します。
ブランディング
PaintApp プロジェクトを実行します。 アプリケーションの起動後、メイン画面のサイズをかなり小さくして、スプラッシュ画面を描画します。 スプラッシュ画面を保存するには、「保存」ボタンを使用します。
元のプロジェクトで PaintApp ノードを右クリックし、「プロパティー」を選択して、「プロジェクトプロパティー」ダイアログの「アプリケーション」をクリックします。
「スタンドアロンアプリケーションを作成」を選択し、「除外」をクリックします。 この操作を行うと、IDE 関連のモジュールがアプリケーションから削除されます。 たとえば、IDE にエディタの機能を提供するライブラリをアプリケーションに含める場合は、代わりに「スキップ」をクリックします。
「ブランド名」に「paintit 」と入力します。 これにより、IDE が配布用 ZIP のために作成する起動ツールの名前が設定されます。
「アプリケーションタイトル」フィールドに「Paint Application 」と入力します。 これにより、新しいアプリケーションのタイトルバーに表示される名前が設定されます。
「スプラッシュ画面」をクリックします。
保存した「スプラッシュ画面」を選択します。 スプラッシュ画面がない場合は、これ を利用できます。 「了解」をクリックしてプロジェクトに接続します。
「ライブラリ」をクリックし、platform6 ノードを展開します。 これは、Paint アプリケーションにバンドルされるモジュールが含まれた、唯一のクラスタです。 チェックされているモジュールは含まれますが、そうでないものは除外されます。 モジュールの多くはすでに除外されています。 手動で除外する必要のあるものが 1 つあります。 Core UI です。 それを選択解除して、除外します。
次に、モジュールプロジェクトの layer.xml ファイルで、「メニュー」フォルダ内の次のタグを追加します。 これらのタグによって、Paint アプリケーションには不要な「移動」および「表示」のメニューが削除されます。
<file name="GoTo_hidden"/>
<file name="View_hidden"/>
また、前述のタグを手動で追加する代わりに、「重要なファイル」ノード内の layer.xml ファイルの、<コンテキスト内のこのレイヤー> ノード内にあるフォルダを削除することもできます。
最後に、もう一度アプリケーションを実行し、スプラッシュ画面を確認します。 アプリケーションが起動したら、指定したタイトルがタイトルバーに表示されていることを確認します。 次のように、メニュー項目、ツールバーボタン、およびその他の機能も少なくなっています。
配布用ファイルの作成
ここで、配布用メディアの選択を行います。 PaintApp ノードを右クリックし、いずれかのオプションを選択します。たとえば、必要なモジュールおよびファイルをすべて含むアプリケーション全体を ZIP ファイルとしてパッケージするには「配布用 ZIP を作成」を選択します。 「JNLP アプリケーションを構築」を選択し、Web サーバーに配置して Web ページから直接リンクできる、アプリケーションの JavaWebStart[tm] バージョンを作成することもできます (正しい URL を設定する必要がある。生成された記述子は file: プロトコルを使用するため、ローカルで Web から起動できる配布版をテストできる)。
以上でチュートリアルは終了です。 NetBeans Platform 上での最初のアプリケーションの構築が終了しました。 次の手順: NetBeans FeedReader チュートリアル