Javafx 简明教程
JavaFX - Application
正如我们已经了解的那样,JavaFX 是一个开源免费软件平台,允许用户开发可在各种设备上一致运行的客户端应用程序。使用 JavaFX,可以创建图形用户界面应用程序(GUI)以及 Internet 或桌面应用程序。所有这些应用程序都将在 Java 中开发。
在本章中,我们将详细讨论 JavaFX 应用程序的结构,并通过示例学习如何创建 JavaFX 应用程序。
JavaFX Application Structure
一般而言,JavaFX 应用程序将具有三个主要组件,即 Stage, Scene 和 Nodes ,如下所示。
Stage
一个舞台(窗口)包含 JavaFX 应用程序的所有对象。它由包 javafx.stage 的 Stage 类表示。主舞台由平台自身创建。创建的舞台对象作为 Application 类的 start() 方法的参数传递(在下一节中说明)。
舞台有两个确定其位置的参数,即 Width 和 Height 。它分为内容区和装饰(标题栏和边框)。
有五种类型的舞台可用 −
-
Decorated
-
Undecorated
-
Transparent
-
Unified
-
Utility
您必须调用 show() 方法以显示舞台的内容。
Scene
场景表示 JavaFX 应用程序的物理内容。它包含场景图的所有内容。包 javafx.scene 的类 Scene 表示场景对象。在某个实例中,场景对象仅添加到一个舞台。
您可以通过实例化 Scene 类来创建场景。您可以选择场景的大小,方法是将其尺寸(高度和宽度)连同 root node 一起传递给其构造函数。
Scene Graph and Nodes
scene graph 是一个树状数据结构(分层),表示场景的内容。相比之下, node 是场景图的可视/图形对象。
节点可能包括 −
-
几何(图形)对象(2D 和 3D),例如 − 圆、矩形、多边形等。
-
UI 控件,例如 − 按钮、复选框、选择框、文本区域等。
-
容器(布局窗格),例如边框窗格、网格窗格、流窗格等。
-
媒体元素,例如音频、视频和图像对象。
包 javafx.scene 的 Node 类表示 JavaFX 中的一个节点,这个类是所有节点的超类。
节点有三种类型 −
-
Root Node − 第一个场景图称为根节点。
-
Branch Node/Parent Node − 具有子节点的节点称为分支/父节点。包 javafx.scene 中名为 Parent 的抽象类是所有父节点的基类,而那些父节点将属于以下类型 − Group − 组节点是一个包含子节点列表的集合节点。每当渲染组节点时,它的所有子节点都会按顺序渲染。对组应用的任何转换、效果状态都将应用于所有子节点。 Region − 它是所有基于 JavaFX 节点的 UI 控件的基类,例如图表、窗格和控件。 WebView − 此节点管理 Web 引擎并显示其内容。
-
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 应用程序,你需要执行以下步骤:
-
使用所需的节点准备场景图。
-
使用所需的维度准备一个 Scene,并将场景图(场景图的根节点)添加到它。
-
准备一个舞台,将场景添加到舞台,并显示舞台的内容。
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 控件的基类,例如 −
-
Chart − 此类是所有图表的基本类,属于包 javafx.scene.chart 。此类有两个子类,分别是 PieChart 和 XYChart 。它们反过来又具有子类,例如 AreaChart, BarChart, BubbleChart 等,用于在 JavaFX 中绘制不同类型的 XY 平面图表。您可以使用这些类在应用程序中嵌入图表。
-
Pane − 窗格是所有布局窗格的基本类,例如 AnchorPane, BorderPane, DialogPane 等。此类属于名为 javafx.scene.layout 的包。您可以使用这些类在应用程序中插入预定义布局。
-
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 节点类层次结构的图表。
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 类表示。此类的对象作为 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();
Lifecycle of JavaFX Application
JavaFX 应用程序类有三个生命周期方法,分别是 −
-
start() − 编写 JavaFX 图形代码的入口点方法。
-
stop() − 可重写的空方法,您可在此编写逻辑以停止应用程序。
-
init() − 可重写的空方法,但您不能在此方法中创建 stage 或 scene。
除了这些以外,它提供名为 launch() 的静态方法以启动 JavaFX 应用程序。
由于 launch() 方法是静态的,您需要从静态上下文中(通常是 main)调用它。每当启动 JavaFX 应用程序时,将会按照(相同顺序)执行以下操作。
-
创建应用程序类的实例。
-
Init() method is called.
-
调用 start() 方法。
-
启动器会等待应用程序完成并调用 stop() 方法。
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 窗口。
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
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