Javafx 简明教程

JavaFX - Application

正如我们已经了解的那样,JavaFX 是一个开源免费软件平台,允许用户开发可在各种设备上一致运行的客户端应用程序。使用 JavaFX,可以创建图形用户界面应用程序(GUI)以及 Internet 或桌面应用程序。所有这些应用程序都将在 Java 中开发。

在本章中,我们将详细讨论 JavaFX 应用程序的结构,并通过示例学习如何创建 JavaFX 应用程序。

JavaFX Application Structure

一般而言,JavaFX 应用程序将具有三个主要组件,即 Stage, SceneNodes ,如下所示。

javafx application structure

Stage

一个舞台(窗口)包含 JavaFX 应用程序的所有对象。它由包 javafx.stageStage 类表示。主舞台由平台自身创建。创建的舞台对象作为 Application 类的 start() 方法的参数传递(在下一节中说明)。

舞台有两个确定其位置的参数,即 WidthHeight 。它分为内容区和装饰(标题栏和边框)。

有五种类型的舞台可用 −

  1. Decorated

  2. Undecorated

  3. Transparent

  4. Unified

  5. Utility

您必须调用 show() 方法以显示舞台的内容。

Scene

场景表示 JavaFX 应用程序的物理内容。它包含场景图的所有内容。包 javafx.scene 的类 Scene 表示场景对象。在某个实例中,场景对象仅添加到一个舞台。

您可以通过实例化 Scene 类来创建场景。您可以选择场景的大小,方法是将其尺寸(高度和宽度)连同 root node 一起传递给其构造函数。

Scene Graph and Nodes

scene graph 是一个树状数据结构(分层),表示场景的内容。相比之下, node 是场景图的可视/图形对象。

节点可能包括 −

  1. 几何(图形)对象(2D 和 3D),例如 − 圆、矩形、多边形等。

  2. UI 控件,例如 − 按钮、复选框、选择框、文本区域等。

  3. 容器(布局窗格),例如边框窗格、网格窗格、流窗格等。

  4. 媒体元素,例如音频、视频和图像对象。

javafx.sceneNode 类表示 JavaFX 中的一个节点,这个类是所有节点的超类。

节点有三种类型 −

  1. Root Node − 第一个场景图称为根节点。

  2. Branch Node/Parent Node − 具有子节点的节点称为分支/父节点。包 javafx.scene 中名为 Parent 的抽象类是所有父节点的基类,而那些父节点将属于以下类型 − Group − 组节点是一个包含子节点列表的集合节点。每当渲染组节点时,它的所有子节点都会按顺序渲染。对组应用的任何转换、效果状态都将应用于所有子节点。 Region − 它是所有基于 JavaFX 节点的 UI 控件的基类,例如图表、窗格和控件。 WebView − 此节点管理 Web 引擎并显示其内容。

  3. Leaf Node − 无子节点的节点称为叶节点。例如,矩形、椭圆、盒子、ImageView、MediaView 是叶节点的示例。

必须将根节点传递到场景图。如果将组传递为根,则所有节点都将剪切到场景,场景大小的任何更改都不会影响场景的布局。

Creating a JavaFX Application

要创建 JavaFX 应用程序,你需要实例化应用程序类并实现其抽象方法 start() 。在此方法中,我们将为 JavaFX 应用程序编写代码。

Application Class

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 应用程序,你需要执行以下步骤:

  1. 使用所需的节点准备场景图。

  2. 使用所需的维度准备一个 Scene,并将场景图(场景图的根节点)添加到它。

  3. 准备一个舞台,将场景添加到舞台,并显示舞台的内容。

Preparing the Scene Graph

根据你的应用程序,你需要使用必需的节点准备一个场景图。由于根节点是第一个节点,因此你需要创建一个根节点。作为根节点,你可以从 Group, Region or WebView 中选择。

Group − 一个 Group 节点由名称为 Group 的类表示,该类属于包 javafx.scene ,你可以通过实例化此类来创建一个 Group 节点,如下所示:

Group root = new Group();

getChildren() 方法 Group 类提供一个 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);

Region − 这是所有基于 JavaFX Node 的 UI 控件的基类,例如 −

  1. Chart − 此类是所有图表的基本类,属于包 javafx.scene.chart 。此类有两个子类,分别是 PieChartXYChart 。它们反过来又具有子类,例如 AreaChart, BarChart, BubbleChart 等,用于在 JavaFX 中绘制不同类型的 XY 平面图表。您可以使用这些类在应用程序中嵌入图表。

  2. Pane − 窗格是所有布局窗格的基本类,例如 AnchorPane, BorderPane, DialogPane 等。此类属于名为 javafx.scene.layout 的包。您可以使用这些类在应用程序中插入预定义布局。

  3. Control − 这是用户界面控件的基本类,例如 Accordion, ButtonBar, ChoiceBox, ComboBoxBase, HTMLEditor, etc. This class belongs to the package 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 节点类层次结构的图表。

webview

Preparing the Scene

JavaFX 场景由 javafx.scene 包的 Scene 类表示。您可以通过实例化此类来创建场景,如下面的代码块所示。

在实例化时,必须将根对象传递给场景类的构造函数。

Scene scene = new Scene(root);

您还可以传递两个表示场景高度和宽度的双类型参数,如下所示。

Scene scene = new Scene(root, 600, 300);

Preparing the Stage

这是任何 JavaFX 应用程序的容器,它为应用程序提供了一个窗口。它由 javafx.stage 包的 Stage 类表示。此类的对象作为 Applicationstart() 方法的参数传递。

使用这个对象,您可以在舞台上执行各种操作。主要是,您可以执行以下操作 −

  1. 使用 setTitle() 方法设置舞台标题。

  2. 使用 setScene() 方法将场景对象附加到舞台。

  3. 使用 show() 方法显示场景的内容,如下所示。

//Setting the title to Stage.
primaryStage.setTitle("Sample application");

//Setting the scene to Stage
primaryStage.setScene(scene);

//Displaying the stage
primaryStage.show();

Lifecycle of JavaFX Application

JavaFX 应用程序类有三个生命周期方法,分别是 −

  1. start() − 编写 JavaFX 图形代码的入口点方法。

  2. stop() − 可重写的空方法,您可在此编写逻辑以停止应用程序。

  3. init() − 可重写的空方法,但您不能在此方法中创建 stage 或 scene。

除了这些以外,它提供名为 launch() 的静态方法以启动 JavaFX 应用程序。

由于 launch() 方法是静态的,您需要从静态上下文中(通常是 main)调用它。每当启动 JavaFX 应用程序时,将会按照(相同顺序)执行以下操作。

  1. 创建应用程序类的实例。

  2. Init() method is called.

  3. 调用 start() 方法。

  4. 启动器会等待应用程序完成并调用 stop() 方法。

Terminating the JavaFX Application

当应用程序的最后一个窗口关闭时,JavaFX 应用程序将被隐式终止。您可以通过将布尔值“False”传递给静态方法* setImplicitExit()*(应从静态上下文中调用)来关闭此行为。

您可以使用 * Platform.exit()* 或 * System.exit*(int) 方法显式终止 JavaFX 应用程序。

Example - Creating an Empty Window

此部分教您如何创建一个显示空窗口的 JavaFX 样例应用程序。以下为步骤 −

Step 1: Creating a Class

创建一个 Java 类,继承包 javafx.application 中的类 Application ,然后实现该类的 start() 方法,如下所示。

public class JavafxSample extends Application {
   @Override
   public void start(Stage primaryStage) throws Exception {
   }
}

Step 2: Creating a Group Object

start() 方法中,通过实例化属于包 javafx.scene 的名为 Group 的类创建一个组对象,如下所示。

Group root = new Group();

Step 3: Creating a Scene Object

通过实例化属于包 javafx.scene 的名为 Scene 的类,创建一个 Scene。向此类传递在上一步中创建的 Group 对象 (root)

除了根对象以外,您还可以将表示高度和宽度的两个双精度参数与 Group 类的对象一起传递,如下所示。

Scene scene = new Scene(root,600, 300);

Step 4: Setting the Title of the Stage

您可以使用 Stage 类的 setTitle() 方法设置舞台的标题。 primaryStage 是 Stage 对象,它作为参数传递给场景类的 start 方法。

使用 primaryStage 对象,将场景的标题设置为 Sample Application ,如下所示。

primaryStage.setTitle("Sample Application");

Step 5: Adding Scene to the Stage

您可以使用名为 Stage 的类的 setScene() 方法,将 Scene 对象添加到舞台。使用此方法添加在之前的步骤中准备的 Scene 对象,如下所示。

primaryStage.setScene(scene);

Step 6: Displaying the Contents of the Stage

使用 Stage 类的名为 show() 的方法显示场景的内容,如下所示。

primaryStage.show();

Step 7: Launching the Application

通过从 main 方法以如下方式调用 Application 类的静态方法 launch() 启动 JavaFX 应用程序。

public static void main(String args[]){
   launch(args);
}

以下程序生成一个空 JavaFX 窗口。将此代码保存在名为 JavafxSample.java 的文件中

Example

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 --module-path %PATH_TO_FX% --add-modules javafx.controls JavafxSample.java
java --module-path %PATH_TO_FX% --add-modules javafx.controls JavafxSample

执行后,上述程序会生成如下所示的 JavaFX 窗口。

sample application plain

Example - Drawing a Straight Line

在前面的示例中,我们已经看到了如何创建空界面。在这个示例中,让我们使用 JavaFX 库尝试绘制一条直线。

绘制直线的代码也遵循了前面的示例中提到的步骤。然而,差别发生在 start() 方法中。在这个方法中,我们通过实例化名为 Group 的类来创建一个 group 对象,该类属于 javafx.scene 包。将使用赋值方法创建的 Line(节点)对象作为 Group 类构造函数的参数传递,以便将其添加到组中。

将此代码保存在名为 DrawingLine.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 --module-path %PATH_TO_FX% --add-modules javafx.controls DrawingLine.java
java --module-path %PATH_TO_FX% --add-modules javafx.controls DrawingLine

Output

执行时,上述程序生成一个 JavaFX 窗口,显示一条直线,如下所示。

drawing line

Example - Displaying Text

我们还可以在 JavaFX 场景中嵌入文本。此示例显示如何用 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 Tutorialspoint");

      //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 --module-path %PATH_TO_FX% --add-modules javafx.controls DisplayingText.java
java --module-path %PATH_TO_FX% --add-modules javafx.controls DisplayingText

Output

执行时,上述程序生成一个 JavaFX 窗口,显示文本,如下所示。

javafx window displaying text