Javafx-application
JavaFX-アプリケーション
この章では、JavaFXアプリケーションの構造を詳細に説明し、JavaFXアプリケーションの作成例をサンプルで学習します。
JavaFXアプリケーション構造
一般に、JavaFXアプリケーションには、次の図に示すように、 Stage、Scene 、 Nodes の3つの主要コンポーネントがあります。
ステージ
ステージ(ウィンドウ)には、JavaFXアプリケーションのすべてのオブジェクトが含まれます。 パッケージ javafx.stage の Stage クラスで表されます。 プライマリステージは、プラットフォーム自体によって作成されます。 作成されたステージオブジェクトは、 Application クラスの* start()*メソッドに引数として渡されます(次のセクションで説明します)。
ステージには、位置を決定する2つのパラメーター、つまり Width と Height があります。 コンテンツ領域と装飾(タイトルバーと境界線)に分かれています。
利用可能なステージの5種類があります-
- 装飾された
- 装飾なし
- トランスペアレント
- 統一
- 実用性
ステージのコンテンツを表示するには、* show()*メソッドを呼び出す必要があります。
シーン
シーンは、JavaFXアプリケーションの物理コンテンツを表します。 シーングラフのすべてのコンテンツが含まれています。 パッケージ javafx.scene のクラス Scene はシーンオブジェクトを表します。 インスタンスでは、シーンオブジェクトは1つのステージにのみ追加されます。
シーンクラスをインスタンス化して、シーンを作成できます。 シーンのサイズ(高さおよび幅)と*ルートノード*をコンストラクターに渡すことで、シーンのサイズを選択できます。
シーングラフとノード
- シーングラフ*は、シーンの内容を表すツリー状のデータ構造(階層)です。 対照的に、*ノード*はシーングラフの視覚的/グラフィカルオブジェクトです。
ノードには次のものが含まれます-
- -円、長方形、多角形などの幾何学的(グラフィック)オブジェクト(2Dおよび3D)
- -ボタン、チェックボックス、選択ボックス、テキスト領域などのUIコントロール
- 境界ペイン、グリッドペイン、フローペインなどのコンテナ(レイアウトペイン)
- オーディオ、ビデオ、画像オブジェクトなどのメディア要素。
パッケージ javafx.scene の Node クラスはJavaFXのノードを表し、このクラスはすべてのノードのスーパークラスです。
前に説明したように、ノードには3つのタイプがあります-
- ルートノード-最初のシーングラフはルートノードとして知られています。
- 分岐ノード/親ノード-子ノードを持つノードは、分岐/親ノードとして知られています。 パッケージ javafx.scene の Parent という抽象クラスは、すべての親ノードの基本クラスであり、それらの親ノードは次のタイプになります-
- グループ-グループノードは、子ノードのリストを含む集合ノードです。 グループノードがレンダリングされるたびに、そのすべての子ノードが順番にレンダリングされます。 グループに適用される変換、エフェクト状態は、すべての子ノードに適用されます。
- 地域-これは、チャート、ペイン、コントロールなど、すべてのJavaFX NodeベースのUIコントロールの基本クラスです。
- WebView -このノードはWebエンジンを管理し、そのコンテンツを表示します。
- リーフノード-子ノードのないノードはリーフノードと呼ばれます。 たとえば、Rectangle、Ellipse、Box、ImageView、MediaViewはリーフノードの例です。
ルートノードをシーングラフに渡すことは必須です。 グループがルートとして渡されると、すべてのノードがシーンにクリップされ、シーンのサイズを変更してもシーンのレイアウトに影響しません。
JavaFXアプリケーションの作成
JavaFXアプリケーションを作成するには、Applicationクラスをインスタンス化し、その抽象メソッド* start()*を実装する必要があります。 このメソッドでは、JavaFXアプリケーションのコードを記述します。
アプリケーションクラス
パッケージ javafx.application の Application クラスは、JavaFXのアプリケーションのエントリポイントです。 JavaFXアプリケーションを作成するには、このクラスを継承し、その抽象メソッド* start()*を実装する必要があります。 このメソッドでは、JavaFXグラフィックスのコード全体を記述する必要があります
*main* メソッドでは、* launch()*メソッドを使用してアプリケーションを起動する必要があります。 このメソッドは、次のプログラムに示すように、Applicationクラスの* start()*メソッドを内部的に呼び出します。
public class JavafxSample extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
/*
Code for JavaFX application.
(Stage, scene, scene graph)
*/
}
public static void main(String args[]){
launch(args);
}
}
- start()*メソッド内で、典型的なJavaFXアプリケーションを作成するには、以下に示す手順に従う必要があります-
- 必要なノードを含むシーングラフを準備します。
- 必要な寸法のシーンを準備し、シーングラフ(シーングラフのルートノード)を追加します。
- ステージを準備し、シーンをステージに追加して、ステージのコンテンツを表示します。
シーングラフの準備
アプリケーションごとに、必要なノードを含むシーングラフを準備する必要があります。 ルートノードは最初のノードであるため、ルートノードを作成する必要があります。 ルートノードとして、 Group、Region、またはWebView から選択できます。
グループ-グループノードは、パッケージ javafx.scene に属する Group というクラスで表されます。以下に示すように、このクラスをインスタンス化することでグループノードを作成できます。
Group root = new Group();
*Group* クラスの* getChildren()*メソッドは、ノードを保持する *ObservableList* クラスのオブジェクトを提供します。 以下に示すように、このオブジェクトを取得してノードを追加できます。
//Retrieving the observable list object
ObservableList list = root.getChildren();
//Setting the text object as a node
list.add(NodeObject);
以下に示すように、インスタンス化時に Group クラスとそのコンストラクターにノードオブジェクトを渡すだけで、ノードオブジェクトをグループに追加することもできます。
Group root = new Group(NodeObject);
地域-すべてのJavaFX NodeベースのUIコントロールの基本クラスです。
- グラフ-このクラスはすべてのグラフの基本クラスであり、パッケージ javafx.scene.chart に属します。 +このクラスには、 PieChart および XYChart の2つのサブクラスがあります。 これら2つのサブクラスには、 AreaChart、BarChart、BubbleChart などのサブクラスがあります。 JavaFXでさまざまなタイプのXY平面グラフを描画するために使用されます。 +これらのクラスを使用して、アプリケーションにチャートを埋め込むことができます。
- Pane -Paneは、 AnchorPane、BorderPane、DialogPane など、すべてのレイアウトペインの基本クラスです。 このクラスは、- javafx.scene.layout と呼ばれるパッケージに属します。 +これらのクラスを使用して、アプリケーションに事前定義されたレイアウトを挿入できます。
- Control - Accordion、ButtonBar、ChoiceBox、ComboBoxBase、HTMLEditorなどのユーザーインターフェイスコントロールの基本クラスです。 このクラスは、パッケージjavafx.scene.control に属します。 +これらのクラスを使用して、アプリケーションにさまざまなUI要素を挿入できます。
グループでは、次のプログラムに示すように、上記のクラスをインスタンス化し、ルートノードとして使用できます。
//Creating a Stack Pane
StackPane pane = new StackPane();
//Adding text area to the pane
ObservableList list = pane.getChildren();
list.add(NodeObject);
*WebView* -このノードはWebエンジンを管理し、そのコンテンツを表示します。
以下は、JavaFXのノードクラス階層を表す図です。
シーンの準備
JavaFXシーンは、パッケージ javafx.scene の Scene クラスで表されます。 次のタラブロックに示すように、このクラスをインスタンス化することでシーンを作成できます。
インスタンス化中に、ルートオブジェクトをシーンクラスのコンストラクターに渡すことが必須です。
Scene scene = new Scene(root);
以下に示すように、シーンの高さと幅を表すdouble型の2つのパラメーターを渡すこともできます。
Scene scene = new Scene(root, 600, 300);
ステージの準備
これは、JavaFXアプリケーションのコンテナであり、アプリケーションのウィンドウを提供します。 これは、パッケージ javafx.stage の Stage クラスで表されます。 このクラスのオブジェクトは、 Application クラスの* start()*メソッドのパラメーターとして渡されます。
このオブジェクトを使用すると、ステージでさまざまな操作を実行できます。 主に、次を実行できます-
- メソッド* setTitle()*を使用して、ステージのタイトルを設定します。
- * setScene()*メソッドを使用して、シーンオブジェクトをステージにアタッチします。
- 以下に示すように、* show()*メソッドを使用してシーンのコンテンツを表示します。
//Setting the title to Stage.
primaryStage.setTitle("Sample application");
//Setting the scene to Stage
primaryStage.setScene(scene);
//Displaying the stage
primaryStage.show();
JavaFXアプリケーションのライフサイクル
JavaFX Applicationクラスには3つのライフサイクルメソッドがあります。
- * start()*-JavaFXグラフィックスコードが書き込まれるエントリポイントメソッド。
- * stop()*-オーバーライドできる空のメソッド。ここでは、アプリケーションを停止するロジックを記述できます。
- * init()*-オーバーライドできる空のメソッドですが、このメソッドでステージまたはシーンを作成することはできません。
これらに加えて、JavaFXアプリケーションを起動する* launch()*という静的メソッドを提供します。
- launch()*メソッドは静的であるため、静的コンテキストから呼び出す必要があります(通常はメイン)。 JavaFXアプリケーションが起動されるたびに、次のアクションが(同じ順序で)実行されます。
- アプリケーションクラスのインスタンスが作成されます。
- * Init()*メソッドが呼び出されます。
- * start()*メソッドが呼び出されます。
- ランチャーは、アプリケーションが終了するまで待機し、* stop()*メソッドを呼び出します。
JavaFXアプリケーションの終了
アプリケーションの最後のウィンドウが閉じられると、JavaFXアプリケーションは暗黙的に終了します。 ブール値「False」を静的メソッド* setImplicitExit()*(静的コンテキストから呼び出す必要があります)に渡すことで、この動作をオフにできます。
メソッド* Platform.exit()または *System.exit (int)を使用して、JavaFXアプリケーションを明示的に終了できます。
例1 –空のウィンドウを作成する
このセクションでは、空のウィンドウを表示するJavaFXサンプルアプリケーションを作成する方法について説明します。 手順は次のとおりです-
ステップ1:クラスを作成する
Javaクラスを作成し、パッケージ javafx.application の Application クラスを継承し、次のようにこのクラスのstart()メソッドを実装します。
public class JavafxSample extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
}
}
ステップ2:グループオブジェクトの作成
- start()メソッドでは、次のように、パッケージ *javafx.scene に属するGroupというクラスをインスタンス化することにより、グループオブジェクトを作成します。
Group root = new Group();
ステップ3:シーンオブジェクトの作成
パッケージ javafx.scene に属する Scene という名前のクラスをインスタンス化して、シーンを作成します。 このクラスに、前の手順で作成したGroupオブジェクト*(root)*を渡します。
ルートオブジェクトに加えて、画面の高さと幅を表す2つのdoubleパラメーターを、Groupクラスのオブジェクトとともに次のように渡すこともできます。
Scene scene = new Scene(root,600, 300);
ステップ4:ステージのタイトルを設定する
*Stage* クラスの* setTitle()*メソッドを使用して、ステージにタイトルを設定できます。 *primaryStage* は、シーンクラスのstartメソッドにパラメーターとして渡されるStageオブジェクトです。
*primaryStage* オブジェクトを使用して、以下に示すように、シーンのタイトルを *Sample Application* として設定します。
primaryStage.setTitle("Sample Application");
ステップ5:シーンをステージに追加する
*Stage* という名前のクラスの* setScene()*メソッドを使用して、Sceneオブジェクトをステージに追加できます。 以下に示すように、このメソッドを使用して、前の手順で準備したSceneオブジェクトを追加します。
primaryStage.setScene(scene);
ステップ6:ステージのコンテンツを表示する
次のように Stage クラスの* show()*という名前のメソッドを使用して、シーンのコンテンツを表示します。
primaryStage.show();
ステップ7:アプリケーションの起動
次のように、メインメソッドから Application クラスの* launch()*静的メソッドを呼び出して、JavaFXアプリケーションを起動します。
public static void main(String args[]){
launch(args);
}
例
次のプログラムは、空のJavaFXウィンドウを生成します。 このコードを JavafxSample.java という名前のファイルに保存します
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
public class JavafxSample extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
//creating a Group object
Group group = new Group();
//Creating a Scene by passing the group object, height and width
Scene scene = new Scene(group ,600, 300);
//setting color to the scene
scene.setFill(Color.BROWN);
//Setting the title to Stage.
primaryStage.setTitle("Sample Application");
//Adding the scene to Stage
primaryStage.setScene(scene);
//Displaying the contents of the stage
primaryStage.show();
}
public static void main(String args[]){
launch(args);
}
}
次のコマンドを使用して、コマンドプロンプトから保存したJavaファイルをコンパイルして実行します。
javac JavafxSample.java
java JavafxSample
実行時に、上記のプログラムは以下に示すようにJavaFXウィンドウを生成します。
例2 –直線を描く
前の例では、空のステージを作成する方法を見てきました。この例では、JavaFXライブラリを使用して直線を描画してみます。
手順は次のとおりです-
ステップ1:クラスを作成する
Javaクラスを作成し、パッケージ javafx.application の Application クラスを継承し、このクラスの* start()*メソッドを次のように実装します。
public class DrawingLine extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
}
}
ステップ2:線の作成
パッケージ javafx.scene.shape に属する Line という名前のクラスをインスタンス化することにより、JavaFXで行を作成できます。このクラスを次のようにインスタンス化します。
//Creating a line object
Line line = new Line();
ステップ3:線にプロパティを設定する
次のコードブロックに示すように、それぞれのセッターメソッドを使用して、プロパティ startX、startY、endX および endY を設定して、X-Y平面に線を描く座標を指定します。
line.setStartX(100.0);
line.setStartY(150.0);
line.setEndX(500.0);
line.setEndY(150.0);
ステップ4:グループオブジェクトの作成
start()メソッドで、パッケージjavafx.sceneに属するGroupというクラスをインスタンス化することにより、グループオブジェクトを作成します。
次のようにグループに追加するために、前のステップで作成されたLine(ノード)オブジェクトを、Groupクラスのコンストラクターへのパラメーターとして渡します-
Group root = new Group(line);
ステップ5:シーンオブジェクトの作成
パッケージ javafx.scene に属する Scene という名前のクラスをインスタンス化して、シーンを作成します。 このクラスに、前の手順で作成されたGroupオブジェクト*(root)*を渡します。
ルートオブジェクトに加えて、画面の高さと幅を表す2つのdoubleパラメーターを、Groupクラスのオブジェクトとともに次のように渡すこともできます。
Scene scene = new Scene(group ,600, 300);
ステップ6:ステージのタイトルを設定する
*Stage* クラスの* setTitle()*メソッドを使用して、ステージにタイトルを設定できます。 *primaryStage* は、シーンクラスのstartメソッドにパラメーターとして渡されるStageオブジェクトです。
*primaryStage* オブジェクトを使用して、シーンのタイトルを次のように *Sample Application* として設定します。
primaryStage.setTitle("Sample Application");
ステップ7:シーンをステージに追加する
*Stage* という名前のクラスの* setScene()*メソッドを使用して、Sceneオブジェクトをステージに追加できます。 この方法を使用して、前の手順で準備したSceneオブジェクトを次のように追加します。
primaryStage.setScene(scene);
ステップ8:ステージのコンテンツを表示する
次のように Stage クラスの* show()*という名前のメソッドを使用して、シーンのコンテンツを表示します。
primaryStage.show();
ステップ9:アプリケーションの起動
次のように、メインメソッドから Application クラスの* launch()*静的メソッドを呼び出して、JavaFXアプリケーションを起動します。
public static void main(String args[]){
launch(args);
}
例
次のプログラムは、JavaFXを使用して直線を生成する方法を示しています。 このコードを JavafxSample.java という名前のファイルに保存します。
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.shape.Line;
import javafx.stage.Stage;
public class DrawingLine extends Application{
@Override
public void start(Stage stage) {
//Creating a line object
Line line = new Line();
//Setting the properties to a line
line.setStartX(100.0);
line.setStartY(150.0);
line.setEndX(500.0);
line.setEndY(150.0);
//Creating a Group
Group root = new Group(line);
//Creating a Scene
Scene scene = new Scene(root, 600, 300);
//Setting title to the scene
stage.setTitle("Sample application");
//Adding the scene to the stage
stage.setScene(scene);
//Displaying the contents of a scene
stage.show();
}
public static void main(String args[]){
launch(args);
}
}
次のコマンドを使用して、コマンドプロンプトから保存したJavaファイルをコンパイルして実行します。
javac DrawingLine.java
java DrawingLine
実行すると、上記のプログラムは、以下に示すような直線を表示するJavaFXウィンドウを生成します。
例3 –テキストの表示
JavaFXシーンにテキストを埋め込むこともできます。 この例は、JavaFXにテキストを埋め込む方法を示しています。
手順は次のとおりです-
ステップ1:クラスを作成する
Javaクラスを作成し、パッケージ javafx.application の Application クラスを継承し、このクラスの* start()*メソッドを次のように実装します。
public class DrawingLine extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
}
}
ステップ2:テキストを埋め込む
パッケージ javafx.scene.shape に属する Text というクラスをインスタンス化して、このクラスをインスタンス化することにより、JavaFXシーンにテキストを埋め込むことができます。
埋め込みテキストを文字列形式で渡すことにより、このクラスをインスタンス化できます。または、以下に示すように、デフォルトのコンストラクターを使用してテキストオブジェクトを作成できます。
//Creating a Text object
Text text = new Text();
ステップ3:フォントの設定
*Text* クラスの* setFont()*メソッドを使用して、テキストにフォントを設定できます。 このメソッドは、パラメータとしてフォントオブジェクトを受け入れます。 以下に示すように、指定されたテキストのフォントを45に設定します。
//Setting font to the text
text.setFont(new Font(45));
ステップ4:テキストの位置を設定する
次のようにそれぞれのsetterメソッド* setX()および setY()*を使用してX、Y座標を設定することにより、X-Y平面上のテキストの位置を設定できます。
//setting the position of the text
text.setX(50);
text.setY(150);
ステップ5:追加するテキストの設定
TextクラスのsetText()メソッドを使用して、追加するテキストを設定できます。 このメソッドは、追加するテキストを表す文字列パラメーターを受け入れます。
text.setText("Welcome to finddevguides");
ステップ6:グループオブジェクトの作成
- start()メソッドで、パッケージ *javafx.scene に属するGroupという名前のクラスをインスタンス化して、グループオブジェクトを作成します。
次のようにグループに追加するために、前の手順で作成されたテキスト(ノード)オブジェクトをパラメータとしてGroupクラスのコンストラクタに渡します-
Group root = new Group(text)
ステップ7:シーンオブジェクトの作成
パッケージ javafx.scene に属する Scene という名前のクラスをインスタンス化して、シーンを作成します。 このクラスに、前の手順で作成したGroupオブジェクト*(root)*を渡します。
ルートオブジェクトに加えて、画面の高さと幅を表す2つのdoubleパラメーターを、Groupクラスのオブジェクトとともに次のように渡すこともできます。
Scene scene = new Scene(group ,600, 300);
ステップ8:ステージのタイトルを設定する
*Stage* クラスの* setTitle()*メソッドを使用して、ステージにタイトルを設定できます。 *primaryStage* は、シーンクラスのstartメソッドにパラメーターとして渡されるStageオブジェクトです。
*primaryStage* オブジェクトを使用して、以下に示すように、シーンのタイトルを *Sample Application* として設定します。
primaryStage.setTitle("Sample Application");
ステップ9:ステージにシーンを追加する
*Stage* という名前のクラスの* setScene()*メソッドを使用して、Sceneオブジェクトをステージに追加できます。 この方法を使用して、前の手順で準備したSceneオブジェクトを次のように追加します。
primaryStage.setScene(scene);
ステップ10:ステージのコンテンツを表示する
次のように Stage クラスの* show()*という名前のメソッドを使用して、シーンのコンテンツを表示します。
primaryStage.show();
ステップ11:アプリケーションの起動
次のように、メインメソッドから Application クラスの* launch()*静的メソッドを呼び出して、JavaFXアプリケーションを起動します。
public static void main(String args[]){
launch(args);
}
例
以下は、JavaFXを使用してテキストを表示するプログラムです。 このコードを DisplayingText.java という名前のファイルに保存します。
import javafx.application.Application;
import javafx.collections.ObservableList;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
public class DisplayingText extends Application {
@Override
public void start(Stage stage) {
//Creating a Text object
Text text = new Text();
//Setting font to the text
text.setFont(new Font(45));
//setting the position of the text
text.setX(50);
text.setY(150);
//Setting the text to be added.
text.setText("Welcome to finddevguides");
//Creating a Group object
Group root = new Group();
//Retrieving the observable list object
ObservableList list = root.getChildren();
//Setting the text object as a node to the group object
list.add(text);
//Creating a scene object
Scene scene = new Scene(root, 600, 300);
//Setting title to the Stage
stage.setTitle("Sample Application");
//Adding scene to the stage
stage.setScene(scene);
//Displaying the contents of the stage
stage.show();
}
public static void main(String args[]){
launch(args);
}
}
次のコマンドを使用して、コマンドプロンプトから保存したJavaファイルをコンパイルして実行します。
javac DisplayingText.java
java DisplayingText
実行すると、上記のプログラムは、次のようにテキストを表示するJavaFXウィンドウを生成します。