| // |
| // Licensed to the Apache Software Foundation (ASF) under one |
| // or more contributor license agreements. See the NOTICE file |
| // distributed with this work for additional information |
| // regarding copyright ownership. The ASF licenses this file |
| // to you under the Apache License, Version 2.0 (the |
| // "License"); you may not use this file except in compliance |
| // with the License. You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, |
| // software distributed under the License is distributed on an |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| // KIND, either express or implied. See the License for the |
| // specific language governing permissions and limitations |
| // under the License. |
| // |
| |
| = NetBeans プラットフォームペイントアプリケーションのチュートリアル |
| :jbake-type: platform_tutorial |
| :jbake-tags: tutorials |
| :jbake-status: published |
| :syntax: true |
| :source-highlighter: pygments |
| :toc: left |
| :toc-title: |
| :icons: font |
| :experimental: |
| :description: NetBeans プラットフォームペイントアプリケーションのチュートリアル - Apache NetBeans |
| :keywords: Apache NetBeans Platform, Platform Tutorials, NetBeans プラットフォームペイントアプリケーションのチュートリアル |
| |
| このチュートリアルでは、NetBeans プラットフォーム上でリッチクライアントアプリケーションを開発するための、NetBeans IDE の基本的な使用方法を学習します。NetBeans プラットフォーム上でアプリケーションを開発する場合は、NetBeans IDE のコア上で開発します。IDE に属するモジュールでアプリケーションに関係ないものはすべて除外されますが、役に立つものは保持されます。IDE のコアですでに利用できる機能を再利用することで、多くの時間と労力を節約できます。 |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| == ペイントアプリケーションについて |
| |
| このチュートリアルは、できるだけすばやく作業を進められるように作られています。NetBeans プラットフォームで簡単なアプリケーションを作成してインストールします。このアプリケーションを使用することによって、画面にペイントし、その結果を保存できます。 |
| |
| |
| image::images/paintapp_result-without-menus-60.png[] |
| |
| この初期バージョンは決して本格的なペイントアプリケーションではありませんが、NetBeans プラットフォーム上でアプリケーションを作成する非常に簡単な例を紹介します。 |
| |
| NOTE: リッチクライアントアプリケーションではなく、NetBeans モジュールについて学習する場合は、 link:nbm-google_ja.html[NetBeans プラグインクイックスタート]のチュートリアルを参照してください。 |
| |
| このチュートリアルでは、IDE に付属しているサンプルのアプリケーションを再作成します。最終的な成果物を確認するため、またはこのチュートリアルを作業する間に発生する問題をトラブルシューティングするために、次の場所にある「新規プロジェクト」ウィザードからサンプルを取得します。 |
| |
| |
| image::images/paintapp_sample-in-new-project-60.png[] |
| |
| |
| == ペイントアプリケーションの設定 |
| |
| この節では、アプリケーションの構造を作成します。最初に、アプリケーションを表すモジュールスイートプロジェクトを作成します。アプリケーションはライブラリに依存するため、ライブラリの JAR ファイルを格納するライブラリラッパーモジュールを作成します。最後に、コードを格納するモジュールプロジェクトを作成します。 |
| |
| |
| === モジュールスイートの作成 |
| |
| モジュールスイートはアプリケーションに相当するもので、特定の結果を作成するために一緒になって機能する一連のモジュールです。また、使用する独自のスプラッシュ画面 (ブランディング)、アプリケーション名、および NetBeans モジュールの種類と数の割り当ても行います。配布用 ZIP の作成や Java WebStart (JNLP) アプリケーションの構築などのアクションを利用することもできます。これらのアクションは、アプリケーションをほかのユーザーが利用できるようにするための重要なツールです。 |
| |
| |
| [start=1] |
| 1. 「ファイル」>「新規プロジェクト」を選択します。「カテゴリ」で「NetBeans モジュール」を選択します。「プロジェクト」で「モジュールスイートプロジェクト」を選択し、「次へ」をクリックします。 |
| |
| [start=2] |
| 1. 「名前と場所」パネルで、「プロジェクト名」に「 ``PaintApp`` 」と入力します。「プロジェクトの場所」を使用コンピュータ上の任意のフォルダに変更します。「主プロジェクトとして設定」チェックボックスがすでに選択されていることを確認します。 |
| |
| |
| image::images/paintapp_newmodulesuite-60.png[] |
| |
| 「完了」をクリックします。 |
| |
| IDE で、新しいモジュールスイートプロジェクトが開きます。「プロジェクト」ウィンドウにはノードが 1 つ含まれています。この「モジュール」ノードは、モジュールスイートプロジェクトに、モジュールプロジェクトおよびライブラリラッパーモジュールプロジェクトを手動で追加するためのものです。「モジュールプロジェクト」ウィザードまたは「ライブラリラッパーモジュールプロジェクト」ウィザードを使用すると、作成するモジュールが自動的にモジュールスイートプロジェクトに追加されます。 |
| |
| |
| === ライブラリラッパーモジュールプロジェクトの作成 |
| |
| ライブラリラッパーモジュールは、JAR ファイルにコードが含まれないモジュールで、ライブラリへの単なるポインタです。これによってライブラリが NetBeans モジュールに変換されると、元の JAR ファイルを変更しなくても、NetBeans クラスローダーシステムのすべての保護が適用されます。その結果、アプリケーションは別の NetBeans モジュールに依存する場合と同じように、そのライブラリに依存することができます。また、このライブラリの新しいバージョンが利用できるようになった場合、ラッパーライブラリ用の NetBeans モジュール (NBM) ファイルを 1 つ配布するだけで、新しいバージョンの配布が可能になります。 |
| |
| NOTE: NetBeans プラットフォーム上で構築を行う利点の 1 つは、ユーザーインタフェースが、Java の標準ユーザーインタフェースツールキットである Swing に基づいていることです。Swing は長い間使用されてきたので、アプリケーションに再利用できる Swing コンポーネントが数多くあります。このチュートリアルでは、既存のカラーチューザ (ソースは ``contrib/coloreditor`` の下の NetBeans CVS 内にある) を再利用します。JAR ファイルは ``ColorChooser.jar`` という名前です。ライブラリは link:http://web.archive.org/web/20081119053233/http://colorchooser.dev.java.net/[ここ]からダウンロードできます。それをファイルシステム内の任意の場所に保存します。次の手順に従って、 ``ColorChooser.jar`` ファイルのためのライブラリラッパーモジュールを作成します。 |
| |
| |
| [start=1] |
| 1. 「ファイル」>「新規プロジェクト」を選択します。「カテゴリ」で「NetBeans モジュール」を選択します。プロジェクトで、「ライブラリラッパーモジュールプロジェクト」を選択し、「次へ」をクリックします。 |
| |
| [start=2] |
| 1. 「名前と場所」パネルで、「ライブラリ」テキストボックスに ``ColorChooser.jar`` のパスを入力するか、その場所を参照します。 |
| |
| [start=3] |
| 1. 「ライセンス」テキストフィールドは空のままにしておきます。最終成果物の配布を予定している場合は、外部ライブラリのライセンスファイルを含めるようにします。 |
| |
| [start=4] |
| 1. 「次へ」をクリックすると、次のように表示されます。 |
| |
| |
| image::images/paintapp_newmodulesuite-library-60.png[] |
| |
| もう一度「次へ」をクリックし、「完了」をクリックします。 |
| |
| |
| === モジュールプロジェクトの作成 |
| |
| ここでは、作成する実際のコードを含めるモジュールが必要になります。 |
| |
| |
| [start=1] |
| 1. 「ファイル」>「新規プロジェクト」を選択します。「カテゴリ」で「NetBeans モジュール」を選択します。「プロジェクト」で「モジュールプロジェクト」を選択し、「次へ」をクリックします。 |
| |
| [start=2] |
| 1. 「名前と場所」パネルで、「プロジェクト名」に「 ``Paint`` 」と入力します。「プロジェクトの場所」を使用コンピュータ上の任意のフォルダに変更します。「モジュールスイートに追加」ラジオボタンが選択され、「モジュールスイート」ドロップダウンリストで ``PaintApp`` モジュールスイートが選択されていることを確認します。「主プロジェクトとして設定」チェックボックスを選択します。「次へ」をクリックします。 |
| |
| [start=3] |
| 1. 「基本モジュール構成」パネルで、「コード名ベース」の ``yourorghere`` を ``netbeans`` に変更し、全体の名前を ``org.netbeans.paint`` にします。「モジュール表示名」は ``Paint`` のままにしておきます。「ローカライズ版バンドル」と「XML レイヤー」の場所はそのままにしておきます。これらは ``org.netbeans.paint`` という名前のパッケージに格納されます。これらのファイルには、次の役割があります。 |
| * *ローカライズ版バンドル。*国際化のための言語固有の文字列を指定します。 |
| * *XML レイヤー。*NetBeans システムにメニューやツールバーボタンなどの項目を登録します。 |
| |
| 「完了」をクリックします。 |
| |
| IDE によって ``Paint`` プロジェクトが作成されます。このプロジェクトには、ソースや、プロジェクトの Ant 構築スクリプトなどのプロジェクトメタデータがすべて含まれます。IDE でプロジェクトが開きます。「プロジェクト」ウィンドウ (Ctrl-1) で、プロジェクトの論理構造を表示できます。また、「ファイル」ウィンドウ (Ctrl-2) で、プロジェクトのファイル構造を表示できます。たとえば、「プロジェクト」ウィンドウは次のように表示されます。 |
| |
| |
| image::images/paintapp_initial-proj-window60.png[] |
| |
| プロジェクトには、ローカライズ版バンドルおよび XML レイヤーのほかに、次の重要なファイルも含まれます。 |
| |
| * *モジュールのマニフェスト。*プロジェクトがモジュールであることを宣言します。また、XML レイヤーの場所、ローカライズ版バンドルの場所、モジュールのバージョンなどの、モジュール固有の設定も行います。 |
| * *構築スクリプト。* ``nbproject/build-impl.xml`` 内の指定よりも優先される、独自の Ant ターゲットをここに作成できます。 |
| * *プロジェクトメタデータ。*プロジェクトの種類、内容、プラットフォーム、クラスパス、依存関係、プロジェクトのコマンドと Ant スクリプト内のターゲットのマッピングなどの情報が含まれます。 |
| |
| このチュートリアルでは、これらの情報を変更する必要はありません。 |
| |
| |
| === モジュールプロジェクトの依存関係の指定 |
| |
| link:https://bits.netbeans.org/dev/javadoc/[NetBeans API] に属するいくつかのクラスをサブクラス化する必要があります。また、そのプロジェクトは ``ColorChooser.jar`` ファイルに依存します。すべての NetBeans API はモジュールによって実装されます。そのため、これらの作業の両方を完成することは、モジュールの実行に必要なモジュールの一覧にいくつかのモジュールを追加することを意味します。 |
| |
| |
| [start=1] |
| 1. 「プロジェクト」ウィンドウで、 ``Paint`` プロジェクトノードを右クリックし、「プロパティー」を選択します。「プロジェクトプロパティー」ダイアログが開きます。「カテゴリ」で「ライブラリ」をクリックします。 |
| |
| [start=2] |
| 1. 次の表に表示されている API のそれぞれについて、「依存関係を追加...」をクリックし、「フィルタ」テキストボックスにサブクラス化するクラスの名前の入力を開始します。 |
| |
| |=== |
| |*クラス* |*API* |*目的* |
| |
| | ``ColorChooser`` | ``ColorChooser`` |作成したカラーチューザコンポーネントのライブラリラッパーモジュール |
| |
| | ``DataObject`` | ``データシステム API`` |DataObject クラスを含む NetBeans モジュール |
| |
| | ``DialogDisplayer`` | ``ダイアログ API`` |ユーザー通知の作成、ダイアログの説明、およびその表示を可能にします |
| |
| | ``AbstractFile`` | ``ファイルシステム API`` |一定の方法でファイルにアクセスする共通の API を提供します |
| |
| | ``AbstractNode`` | ``ノード API`` |NetBeans 内のオブジェクトを視覚化する主機構として機能します |
| |
| | ``StatusDisplayer`` | ``UI ユーティリティー API`` |メインウィンドウのステータスバーの作成に使用される StatusDisplayer クラス |
| |
| | ``WeakListeners`` | ``ユーティリティー API`` |WeakListeners クラスを含みます |
| |
| | ``TopComponent`` | ``ウィンドウシステム API`` |TopComponent JPanel クラスを含みます |
| |=== |
| |
| 上記の表の最初の列には、このチュートリアルでサブクラス化するすべてのクラスが一覧表示されています。それぞれについて、「フィルタ」にクラス名を入力し始めると、「モジュール」リストの表示が絞り込まれます。表の 2 番目の列を使用して、絞り込まれた「モジュール」リストから適切な API (または ``ColorChooser`` の場合はライブラリ) を選択し、「了解」をクリックして選択を確認します。 |
| |
| |
| image::images/paintapp_libfilter-60.png[] |
| |
| |
| [start=3] |
| 1. 「了解」をクリックして、「プロジェクトプロパティー」ダイアログを終了します。 |
| |
| [start=4] |
| 1. 「プロジェクト」ウィンドウで、Paint モジュールのプロジェクトノードが展開されていない場合は展開します。次に「重要なファイル」ノードを展開し、「プロジェクトメタデータ」ノードをダブルクリックします。選択した API はモジュールの依存関係として宣言されています。 |
| |
| |
| |
| == ペイントキャンバスの作成と埋め込み |
| |
| |
| === キャンバスの作成 |
| |
| 次の手順では、ユーザーがペイントする実際のコンポーネントを作成します。ここでは、純粋な Swing コンポーネントを使用するため、その実装の詳細は省略し、最終バージョンのみを提供します。ライブラリラッパーモジュールを作成したカラーチューザ Bean が、このパネルのソースコードに使用されます。完成したアプリケーションを実行すると、画像編集用パネルのツールバーでこのカラーチューザ Bean を確認できます。 |
| |
| |
| [start=1] |
| 1. 「プロジェクト」ウィンドウで、「 ``Paint`` 」ノード、「ソースパッケージ」ノードを順に展開し、「 ``org.netbeans.paint`` 」ノードを右クリックします。「新規」>「Java クラス」を選択します。 |
| |
| [start=2] |
| 1. クラス名として「 ``PaintCanvas`` 」と入力します。パッケージの一覧に ``org.netbeans.paint`` があることを確認します。「完了」をクリックします。ソースエディタに ``PaintCanvas.java`` が表示されます。 |
| |
| [start=3] |
| 1. このファイルのデフォルトの内容を link:https://netbeans.apache.org/platform/guide/tutorials/paintTutorial/PaintCanvas.java[ここ]に示す内容で置き換えます。パッケージに ``org.netbeans.paint`` 以外の名前を付けた場合は、ソースエディタでパッケージ名を修正します。 |
| |
| |
| === TopComponent クラスの準備 |
| |
| ここでは、 link:https://bits.netbeans.org/dev/javadoc/[NetBeans API] を利用する最初のクラスを作成します。それは `` link:https://bits.netbeans.org/dev/javadocorg-openide-windows/org/openide/windows/TopComponent.html[TopComponent]`` クラスです。 ``TopComponent`` クラスは、NetBeans のウィンドウシステムで操作可能な ``JPanel`` クラスであり、メインウィンドウのタブ付きコンテナ内に配置できます。 |
| |
| |
| [start=1] |
| 1. 「プロジェクト」ウィンドウで、「 ``Paint`` 」ノード、「ソースパッケージ」ノードを順に展開し、「 ``org.netbeans.paint`` 」ノードを右クリックします。「新規」>「Java クラス」を選択します。 |
| クラス名として「 ``PaintTopComponent`` 」と入力します。パッケージの一覧に ``org.netbeans.paint`` があることを確認します。「完了」をクリックします。ソースエディタに ``PaintTopComponent.java`` が表示されます。 |
| |
| [start=2] |
| 1. ファイルの最上部近くにあるクラス宣言を次のように変更します。 |
| |
| [source,java] |
| ---- |
| |
| public class PaintTopComponent extends TopComponent implements ActionListener, ChangeListener { |
| ---- |
| |
| |
| [start=3] |
| 1. Ctrl-Shift-I キーを押してインポートを修正し、ダイアログで「了解」をクリックします。このファイルの最上部にある、必要なインポートパッケージの宣言は IDE によって行われます。 |
| |
| 入力したクラス宣言の下に赤い線が表示されます。その行にカーソルを置くと、左側の余白に電球が表示されます。次に示すように、電球をクリックするか、Alt-Enter キーを押します。 |
| |
| |
| image::images/paintapp_lightbulb-60.png[] |
| |
| 「すべての抽象メソッドの実装」を選択します。IDE によって、2 つのメソッド ``actionPerformed()`` と ``stateChanged()`` のスケルトンが生成されます。このチュートリアルでは、あとでこれらの記述を行います。 |
| |
| |
| [start=4] |
| 1. 次の 3 つの変数の宣言を ``PaintTopComponent`` クラスの最上部に追加し、インポート文を修正します (Ctrl-Shift-I)。 |
| |
| [source,java] |
| ---- |
| |
| private PaintCanvas canvas = new PaintCanvas(); //ユーザーが描画するコンポーネント |
| private JComponent preview; //ペイントブラシサイズを示すツールバーのコンポーネント |
| private static int ct = 0; //新しい画像の名前を用意するために使用するカウンタ |
| ---- |
| |
| |
| [start=5] |
| 1. 今度は、2 つのボイラープレートメソッドを実装する必要があります。1 つはアプリケーションの停止時に、開いているウィンドウを無視するようにウインドウシステムに指示するものです。もう 1 つは、コンポーネントの一意の文字列 ID 用のベース文字列を提供するものです。各 ``TopComponent`` には、 ``TopComponent`` を保存するときに使用される一意の文字列 ID があります。次の 2 つのメソッドを ``PaintTopComponent`` クラスに挿入します。 |
| |
| [source,java] |
| ---- |
| |
| public int getPersistenceType() { |
| return PERSISTENCE_NEVER; |
| } |
| |
| public String preferredID() { |
| return "Image"; |
| } |
| ---- |
| |
| クラスは次のようになります。 |
| |
| |
| [source,java] |
| ---- |
| |
| public class PaintTopComponent extends TopComponent implements ActionListener, ChangeListener { |
| |
| private PaintCanvas canvas = new PaintCanvas(); //ユーザーが描画するコンポーネント |
| private JComponent preview; //ペイントブラシサイズを示すツールバーのコンポーネント |
| private static int ct = 0; //新しい画像の名前を用意するために使用するカウンタ |
| |
| public PaintTopComponent() { |
| } |
| |
| public void actionPerformed(ActionEvent arg0) { |
| throw new UnsupportedOperationException("Not supported yet."); |
| } |
| |
| public void stateChanged(ChangeEvent arg0) { |
| throw new UnsupportedOperationException("Not supported yet."); |
| } |
| |
| public int getPersistenceType() { |
| return PERSISTENCE_NEVER; |
| } |
| |
| public String preferredID() { |
| return "Image"; |
| } |
| |
| } |
| ---- |
| |
| |
| === TopComponent クラスの初期化 |
| |
| この節では、ユーザーインタフェースを初期化するコードを追加します。 |
| |
| |
| [start=1] |
| 1. IDE がクラスの最上部近くに作成したコンストラクタに入力して、インポート文を修正します (Ctrl-Shift-I)。 |
| |
| [source,java] |
| ---- |
| |
| public PaintTopComponent() { |
| |
| initComponents(); |
| |
| String displayName = NbBundle.getMessage( |
| PaintTopComponent.class, |
| "UnsavedImageNameFormat", |
| new Object[] { new Integer(ct++) } |
| ); |
| |
| setDisplayName(displayName); |
| |
| } |
| ---- |
| |
| このコードは非常に簡潔です。最初の呼び出しは、まだ作成されていない ``initComponents()`` メソッドに対するものです。このメソッドは、ツールバーおよび PaintCanvas を ``TopComponent`` に追加します。このメソッドはまだ作成されていないので、その下に赤い線が表示されています。前と同じように電球をクリックするか Alt-Enter キーを押して、提案を受け入れます。 |
| |
| |
| image::images/paintapp_lightbulb-initcomponents-60.png[] |
| |
| ``initComponents()`` メソッドのスケルトンが生成されます。 |
| |
| |
| [start=2] |
| 1. 「プロジェクト」ウィンドウで ``org.netbeans.paint`` パッケージを展開します。 ``Bundle.properties`` ファイルをダブルクリックして、ソースエディタで開きます。最後の部分に、次の行を追加します。 |
| |
| [source,java] |
| ---- |
| |
| UnsavedImageNameFormat=Image {0} |
| ---- |
| |
| これは、アプリケーションの新しい画像ファイルを、ユーザーが保存する前に識別するために使用されるテキストを指定します。たとえば、完成したアプリケーションではじめて「New Canvas」をクリックすると、ソースエディタ上に「Image 0」というラベルのタブが表示されます。次に進む前に、このファイルを必ず保存します。 |
| |
| |
| === スケルトンメソッドの記入 |
| |
| この節では、アプリケーションのユーザーインタフェースをコーディングします。レイアウトを視覚的にデザインするために、IDE の GUI ビルダーを使用することもできます。 |
| |
| |
| [start=1] |
| 1. ``initComponents()`` メソッドでコンポーネントをパネルにインストールすると、ユーザーが対話できます。 ``PaintTopComponent.java`` クラスの前の節で、そのスケルトンメソッドを作成しました。そこに、次のように記述します。 |
| |
| [source,java] |
| ---- |
| |
| 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); |
| |
| } |
| ---- |
| |
| Ctrl-Shift-I キーを押して、必要なインポート文を生成します。 |
| |
| |
| [start=2] |
| 1. 生成したほかの 2 つのメソッドにも記述します。これらのメソッドは、 ``PaintTopComponent`` クラスの監視に使用されます。 |
| |
| [source,java] |
| ---- |
| |
| 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()); |
| |
| } |
| ---- |
| |
| |
| [source,java] |
| ---- |
| |
| public void stateChanged(ChangeEvent e) { |
| |
| JSlider js = (JSlider) e.getSource(); |
| canvas.setDiam (js.getValue()); |
| preview.paintImmediately(0, 0, preview.getWidth(), preview.getHeight()); |
| |
| } |
| ---- |
| |
| |
| [start=3] |
| 1. ``Bundle.properties`` ファイルの最後に、次のキーと値のペアを追加します。 |
| |
| [source,java] |
| ---- |
| |
| LBL_Clear = Clear |
| LBL_Foreground = Foreground |
| LBL_BrushSize = Brush Size |
| |
| ---- |
| |
| 次に進む前に、このファイルを必ず保存します。 |
| |
| |
| === ディスクへの画像の保存 |
| |
| 新しいアプリケーションで、作成した画像を保存できるようにします。次のコードを ``PaintTopComponent`` クラスに含めると、この機能が有効になります。 |
| |
| |
| [start=1] |
| 1. 次のコードを ``PaintTopComponent`` クラスに挿入します。 |
| |
| [source,java] |
| ---- |
| |
| public void save() throws IOException { |
| |
| if (getDisplayName().endsWith(".png")) { |
| doSave(new File(getDisplayName())); |
| } else { |
| saveAs(); |
| } |
| |
| } |
| ---- |
| |
| |
| [source,java] |
| ---- |
| |
| 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(".png")) { |
| f = new File(f.getPath() + ".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); |
| |
| } |
| |
| } |
| ---- |
| |
| |
| [source,java] |
| ---- |
| |
| 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()); |
| |
| } |
| ---- |
| |
| |
| [start=2] |
| 1. ``Bundle.properties`` ファイルに次の行を追加します。 |
| |
| [source,java] |
| ---- |
| |
| MSG_SaveFailed = Could not write to file {0} |
| MSG_Overwrite = {0} exists. Overwrite? |
| MSG_Saved = Saved image to {0} |
| ---- |
| |
| 次に進む前に、このファイルを必ず保存します。 |
| |
| |
| [start=3] |
| 1. Ctrl-Shift-I キーを押して、インポート文を修正します。 ``File`` クラスに 2 つの完全修飾名があることがわかります。 ``java.io.File`` オプションを選択します。 |
| |
| |
| |
| == 「New Canvas」メニュー項目の作成 |
| |
| 「モジュールの開発」ファイルテンプレートを使用して、モジュールの機能の基礎を作成します。ファイルテンプレートを使用すると、IDE は作成した項目を ``layer.xml`` ファイルに登録します。ファイルテンプレートを作成するウィザードを使用したあと、 link:https://bits.netbeans.org/dev/javadoc/[NetBeans API] を使用してモジュールの開発を継続します。 |
| |
| |
| [start=1] |
| 1. 「プロジェクト」ウィンドウで Paint モジュールのプロジェクトノードを右クリックし、「新規」>「ファイル/フォルダ」を選択します。「新規ファイル」ウィザードで、「カテゴリ」から「NetBeans モジュールの開発」を選択し、「ファイルの種類」から「アクション」を選択します。「次へ」をクリックします。 |
| |
| [start=2] |
| 1. 「アクションの種類」パネルで、デフォルトを受け入れます。「次へ」をクリックします。 |
| |
| [start=3] |
| 1. 「GUI 登録」パネルで、「大域メニュー項目」と「大域ツールバーボタン」を選択します。次の値を設定します。 |
| |
| * *カテゴリ:* 編集 |
| * *メニュー:* ファイル |
| * *位置:* 任意の場所 |
| * *ツールバー:* ファイル |
| * *位置:* 任意の場所 |
| |
| NOTE: ファイルのメニュー内およびファイルのツールバー内であれば、アクションはどこに置いてもかまいません。 |
| |
| 画面は次のようになります。 |
| |
| |
| image::images/paintapp_newcanvasaction-60.png[] |
| |
| 「次へ」をクリックします。 |
| |
| |
| [start=4] |
| 1. 「名前、アイコン、および場所」パネルで、「クラス名」に「 ``NewCanvasAction`` 」、「表示名」に「 ``New Canvas`` 」と入力します。 |
| |
| 「アイコン」に、アイコン |
| image::images/paintapp_new_icon.png[] をペーストします (右クリックして ``org.netbeans.paint`` フォルダに保存)。 |
| |
| |
| [start=5] |
| 1. 「完了」をクリックします。 |
| |
| IDE によって ``org.netbeans.paint`` に ``NewCanvasAction.java`` が作成され、ソースエディタに表示されます。次が表示されます (リンクをクリックすると、関連する NetBeans API Javadoc が表示される)。 |
| |
| |
| [source,java] |
| ---- |
| |
| package org.netbeans.paint; |
| |
| import link:https://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/HelpCtx.html[org.openide.util.HelpCtx]; |
| import link:https://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/NbBundle.html[org.openide.util.NbBundle]; |
| import link:https://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/actions/CallableSystemAction.html[org.openide.util.actions.CallableSystemAction]; |
| |
| public final class NewCanvasAction extends CallableSystemAction { |
| |
| public void link:https://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/actions/CallableSystemAction.html#performAction()[performAction()] { |
| // TODO アクション本体の実装 |
| } |
| |
| public String link:https://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/actions/SystemAction.html#getName()[getName()] { |
| return NbBundle.getMessage(NewCanvasAction.class, "CTL_NewCanvasAction"); |
| } |
| |
| protected String link:https://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/actions/SystemAction.html#iconResource()[iconResource()] { |
| return "org/netbeans/paint/new_icon.png"; |
| } |
| |
| public HelpCtx link:https://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/actions/SystemAction.html#getHelpCtx()[getHelpCtx()] { |
| return HelpCtx.DEFAULT_HELP; |
| } |
| |
| protected boolean link:https://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/actions/CallableSystemAction.html#asynchronous()[asynchronous()] { |
| return false; |
| } |
| |
| } |
| ---- |
| |
| 「GUI 登録」パネルで指定したように、アクションのクラスが IDE によってメニュー項目およびツールバーボタンとして ``layer.xml`` ファイルに登録されます。 |
| |
| |
| [start=6] |
| 1. ソースエディタで ``NewCanvasAction.java`` を開き、 ``performAction()`` メソッドに次のように記述します。 |
| |
| [source,java] |
| ---- |
| |
| public void performAction() { |
| |
| PaintTopComponent tc = new PaintTopComponent(); |
| tc.open(); |
| tc.requestActive(); |
| |
| } |
| ---- |
| |
| これを実行すると、単純に画像編集コンポーネントの新しいインスタンスが作成され、メインウィンドウに表示されます。さらに、キーボードフォーカスが移動されてそのタブが選択され、有効化されます。 |
| |
| |
| == 「Save Canvas」メニュー項目の作成 |
| |
| 前の節では「新規アクション」ウィザードを使用してメニュー項目を作成しました。ここでは画像を保存します。 |
| |
| |
| [start=1] |
| 1. 「プロジェクト」ウィンドウで Paint モジュールのプロジェクトノードを右クリックし、「新規」>「ファイル/フォルダ」を選択します。「新規ファイル」ウィザードで、「カテゴリ」から「NetBeans モジュールの開発」を選択し、「ファイルの種類」から「アクション」を選択します。「次へ」をクリックします。 |
| |
| [start=2] |
| 1. 「アクションの種類」パネルで、デフォルトを受け入れます。「次へ」をクリックします。 |
| |
| [start=3] |
| 1. 「GUI 登録」パネルで、「大域メニュー項目」と「大域ツールバーボタン」を選択します。次の値を設定します。 |
| |
| * *カテゴリ:* 編集 |
| * *メニュー:* ファイル |
| * *位置:* 任意の場所 |
| * *ツールバー:* ファイル |
| * *位置:* 任意の場所 |
| |
| NOTE: ファイルのメニュー内およびファイルのツールバー内であれば、アクションはどこに置いてもかまいません。 |
| |
| 「次へ」をクリックします。 |
| |
| |
| [start=4] |
| 1. 「名前、アイコン、および場所」パネルで、「クラス名」に「 ``SaveCanvasAction`` 」、「表示名」に「 ``Save Canvas`` 」と入力します。 |
| |
| 「アイコン」に、アイコン |
| image::images/paintapp_save_icon.png[] をペーストします (右クリックして ``org.netbeans.paint`` フォルダに保存)。 |
| |
| |
| [start=5] |
| 1. 「完了」をクリックします。 |
| |
| IDE によって ``org.netbeans.paint`` に ``SaveCanvasAction.java`` が作成され、ソースエディタに表示されます。 |
| |
| |
| [start=6] |
| 1. ソースエディタで、 ``SaveCanvasAction.java`` が開いていることを確認し、 ``performAction()`` メソッドに次のように記述します。 |
| |
| [source,java] |
| ---- |
| |
| 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(); |
| |
| } |
| |
| } |
| ---- |
| |
| Ctrl-Shift-I キーを押して、必要なインポート文を生成します。 |
| |
| |
| image::images/paintapp_fiximports-60.png[] |
| |
| |
| [start=7] |
| 1. クラス宣言を変更して、プロパティー変更リスナーを追加します。 |
| |
| [source,java] |
| ---- |
| |
| public final class SaveCanvasAction extends CallableSystemAction implements PropertyChangeListener { |
| ---- |
| |
| ふたたび赤い線が表示されます。Alt-Enter キーを押して電球を表示させ、提案を選択します。 |
| |
| |
| image::images/paintapp_lightbulb-listener1-60.png[] |
| |
| ふたたび赤い線が表示されます。前の手順を繰り返し、提案を受け入れます。 |
| |
| |
| image::images/paintapp_lightbulb-listener2-60.png[] |
| |
| 生成された ``propertyChange()`` メソッドに、次のように記述します。 |
| |
| |
| [source,java] |
| ---- |
| |
| public void propertyChange(PropertyChangeEvent evt) { |
| |
| if (TopComponent.Registry.PROP_ACTIVATED.equals(evt.getPropertyName())){ |
| updateEnablement(); |
| } |
| |
| } |
| ---- |
| |
| 赤い線が表示されたら、Alt-Enter キーを押して、IDE が ``SaveCanvasAction`` クラスに ``updateEnablement()`` メソッドを作成できるようにします。 |
| |
| 次に、 ``updateEnablement()`` メソッドを次のように定義します。 |
| |
| |
| [source,java] |
| ---- |
| |
| private void updateEnablement() { |
| |
| setEnabled(TopComponent.getRegistry().getActivated() |
| instanceof PaintTopComponent); |
| |
| } |
| ---- |
| |
| 最後に、コンストラクタを次のように定義します。 |
| |
| |
| [source,java] |
| ---- |
| |
| public SaveCanvasAction() { |
| |
| TopComponent.getRegistry().addPropertyChangeListener ( |
| WeakListeners.propertyChange(this, |
| TopComponent.getRegistry())); |
| |
| updateEnablement(); |
| |
| } |
| ---- |
| |
| 赤い線が表示されたら、Alt-Enter キーを押して、IDE が ``org.openide.util.WeakListeners`` をインポートできるようにします。 |
| |
| 特に興味深いのは、プロパティー変更リスナーを追加するコードです。 ``TopComponent.Registry`` は、システムで開かれているすべての ``TopComponents`` のレジストリ、つまり開かれているすべてのタブのレジストリです。ここで行いたいことは、その変更の待機と、フォーカスのある対象に応じた、アクションの有効化または無効化です。 |
| |
| NOTE: プロパティー変更リスナーを直接接続するのではなく、 ``WeakListeners.propertyChange()`` を呼び出します。これを実行すると、アクションを弱参照するプロパティー変更リスナーが生成されます。実際には、アプリケーションが開かれているかぎりこのアクションは存続します。リスナーを接続していて、切り離すコードが存在しない場合は、弱参照リスナーを使用するほうが良く、また将来の保証があります。そうでない場合、メモリーリークが発生する可能性があります。レジストリがリスナーのリスト内にアクションの参照を保持しているため、アクションに対するガベージコレクションが行われません。 |
| |
| 「プロジェクト」ウィンドウには、次のように表示されます。 |
| |
| |
| image::images/paintapp_final-proj-window-60.png[] |
| |
| |
| == 最後の仕上げ |
| |
| もちろん、作成するのはアプリケーションであって、IDE ではありません。そのため、不要な IDE のモジュールやユーザーインタフェース要素を除外するための、いくつかの最終手順を実行します。まず、アプリケーション用のスプラッシュ画面を作成し、次に不要なモジュールを削除します。最後に、配布用 ZIP および JNLP アプリケーションを作成します。 |
| |
| |
| [start=1] |
| 1. ``PaintApp`` プロジェクトを実行します。アプリケーションが起動したら、メイン画面のサイズをかなり小さくして、スプラッシュ画面を描画します。「保存」ボタンを使用して、スプラッシュ画面を保存します。 |
| |
| [start=2] |
| 1. 元のプロジェクトで、 ``PaintApp`` ノードを右クリックして「プロパティー」を選択し、「プロジェクトプロパティー」ダイアログで「構築」をクリックします。 |
| |
| [start=3] |
| 1. 「スタンドアロンアプリケーションを作成」を選択します。「ブランド名」(IDE によって生成される起動ツール名になる) および「アプリケーションタイトル」(アプリケーションのタイトルバーに表示される) を指定できます。デフォルトでは、次のように表示されます。 |
| |
| |
| image::images/paintapp_splashscreen1-60.png[] |
| |
| |
| [start=4] |
| 1. 「スプラッシュ画面」をクリックします。スプラッシュ画面を参照します。スプラッシュ画面がない場合は、 link:https://netbeans.apache.org/platform/images/tutorials/paintapp/splash.gif[これ]を使用できます。「了解」をクリックし、アプリケーションに接続します。 |
| |
| |
| image::images/paintapp_splashscreen-60.png[] |
| |
| |
| [start=5] |
| 1. 「ライブラリ」をクリックし、 ``platform7`` ノードを展開します。これは、Paint アプリケーションにバンドルされるモジュールが含まれた、唯一のクラスタです。チェックしたモジュールは含まれますが、そうでないものは除外されます。モジュールの多くはすでに除外されています。手動で除外する必要のあるものが 1 つあります。 ``Core UI`` です。それを選択解除して、除外します。 |
| |
| Paint モジュールの ``layer.xml`` ファイルで、「メニュー」フォルダ内の次のタグを追加します。これらのタグによって、Paint アプリケーションには不要な「移動」および「表示」のメニューが削除されます。 |
| |
| |
| [source,java] |
| ---- |
| |
| <file name="GoTo_hidden"/> |
| <file name="View_hidden"/> |
| ---- |
| |
| また、前述のタグを手動で追加する代わりに、 ``layer.xml`` ファイルの「 ``<コンテキスト内のこのレイヤー>`` 」ノード内にあるフォルダを削除できます。これを行うには、「 ``<コンテキスト内のこのレイヤー>`` 」を展開し、「メニュバー」ノードを展開します。「移動」および「表示」ノードの右クリックメニューから「削除」を選択します。 |
| |
| |
| [start=6] |
| 1. 最後に、もう一度アプリケーションを実行し、スプラッシュ画面を確認します。アプリケーションが起動したら、タイトルバーに指定したタイトルが表示されていることを確認します。また、次のように、メニュー項目、ツールバーボタン、およびその他の機能も少なくなっています。 |
| |
| |
| image::images/paintapp_result-without-menus-60.png[] |
| |
| |
| == 配布用の作成 |
| |
| ここで、配布用メディアを選択します。 ``PaintApp`` ノードを右クリックして「配布用 ZIP を作成」を選択し、必要なモジュールとファイルをすべて含むアプリケーション全体を zip ファイルとしてパッケージ化します。また、「JNLP アプリケーションを構築」を選択し、Web サーバーに配置して Web ページから直接リンクできる、アプリケーションの JavaWebStart™ バージョンを作成することもできます。これには正しい URL を設定する必要があります。生成された記述子は file: プロトコルを使用するため、ローカルで Web から起動できる配布版をテストできます。 |
| |
| 以上でチュートリアルは終了です。NetBeans プラットフォーム上での最初のアプリケーションの構築が完了しました。次は、 link:https://netbeans.apache.org/tutorials/60/nbm-feedreader.html[NetBeans プラットフォーム 6.0 フィードリーダーのチュートリアル]です。 |
| |
| link:http://netbeans.apache.org/community/mailing-lists.html[ご意見をお寄せください] |