- JavaFX Tutorial
- JavaFX - Home
- JavaFX - Overview
- JavaFX - Environment
- JavaFX - Architecture
- JavaFX - Application
- JavaFX - 2D Shapes
- JavaFX - Text
- JavaFX - Effects
- JavaFX - Transformations
- JavaFX - Animations
- JavaFX - Colors
- JavaFX - Images
- JavaFX - 3D Shapes
- JavaFX - Event Handling
- JavaFX - UI Controls
- JavaFX - Charts
- JavaFX - Layout Panes
- JavaFX - CSS
- JavaFX Useful Resources
- JavaFX - Quick Guide
- JavaFX - Useful Resources
- JavaFX - Discussion
JavaFX - 应用程序
在本章中,我们将详细讨论 JavaFX 应用程序的结构,并通过示例学习如何创建 JavaFX 应用程序。
JavaFX应用程序结构
一般来说,JavaFX 应用程序将具有三个主要组件,即舞台、场景和节点,如下图所示。
阶段
阶段(窗口)包含 JavaFX 应用程序的所有对象。它由包javafx.stage的Stage类表示。初级阶段是平台自己创建的。创建的阶段对象作为参数传递给Application类的start()方法(将在下一节中解释)。
舞台有两个参数确定其位置,即Width和Height。它分为内容区域和装饰(标题栏和边框)。
有五种类型的阶段可用 -
- 装饰
- 未装饰
- 透明的
- 统一
- 公用事业
您必须调用show()方法来显示舞台的内容。
场景
场景代表 JavaFX 应用程序的物理内容。它包含场景图的所有内容。javafx.scene包的Scene类代表场景对象。在某一实例中,场景对象仅添加到一个阶段。
您可以通过实例化场景类来创建场景。您可以通过将场景的尺寸(高度和宽度)以及根节点传递给其构造函数来选择场景的大小。
场景图和节点
场景图是表示场景内容的树状数据结构(分层)。相反,节点是场景图的视觉/图形对象。
一个节点可以包括 -
几何(图形)对象(2D 和 3D),例如 - 圆形、矩形、多边形等。
UI 控件,例如 - 按钮、复选框、选择框、文本区域等。
容器(布局窗格),例如边框窗格、网格窗格、流程窗格等。
媒体元素,例如音频、视频和图像对象。
javafx.scene包中的Node类代表JavaFX中的一个节点,该类是所有节点的超类。
如前所述,节点分为三种类型 -
根节点- 第一个场景图称为根节点。
分支节点/父节点- 具有子节点的节点称为分支/父节点。javafx.scene包中名为Parent的抽象类是所有父节点的基类,这些父节点将具有以下类型 -
组- 组节点是包含子节点列表的集体节点。每当渲染组节点时,其所有子节点都会按顺序渲染。应用于该组的任何变换、效果状态都将应用于所有子节点。
Region - 它是所有基于 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中进行选择。
Group - Group 节点由属于包javafx.scene的名为Group的类表示,您可以通过实例化此类来创建 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);
我们还可以将 Node 对象添加到组中,只需在实例化时将它们传递给Group类及其构造函数即可,如下所示。
Group root = new Group(NodeObject);
区域- 它是所有基于 JavaFX 节点的 UI 控件的基类,例如 -
Chart - 此类是所有图表的基类,它属于包javafx.scene.chart。
该类有两个子类,即PieChart和XYChart。这两个又具有AreaChart、BarChart、BubbleChart等子类,用于在 JavaFX 中绘制不同类型的 XY 平面图表。
您可以使用这些类将图表嵌入到您的应用程序中。
Pane - Pane 是所有布局窗格的基类,例如AnchorPane、BorderPane、DialogPane等。此类属于名为 - javafx.scene.layout的包。
您可以使用这些类在应用程序中插入预定义的布局。
Control - 它是用户界面控件的基类,例如Accordion、ButtonBar、ChoiceBox、ComboBoxBase、HTMLEditor 等。此类属于包 javafx.scene.control。
您可以使用这些类在应用程序中插入各种 UI 元素。
在 Group 中,您可以实例化上述任何类并将它们用作根节点,如以下程序所示。
//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 类型参数,如下所示。
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 类具有三个生命周期方法,它们是 -
start() - 要编写 JavaFX 图形代码的入口点方法。
stop() - 一个可以被覆盖的空方法,在这里您可以编写逻辑来停止应用程序。
init() - 一个可以被覆盖的空方法,但您不能在此方法中创建舞台或场景。
除此之外,它还提供了一个名为launch()的静态方法来启动 JavaFX 应用程序。
由于launch()方法是静态的,因此您需要从静态上下文(通常是 main)调用它。每当启动 JavaFX 应用程序时,都会执行以下操作(按相同顺序)。
创建应用程序类的实例。
调用Init()方法。
调用start ()方法。
启动器等待应用程序完成并调用stop()方法。
终止 JavaFX 应用程序
当应用程序的最后一个窗口关闭时,JavaFX 应用程序将隐式终止。您可以通过将布尔值“False”传递给静态方法setImplicitExit()(应从静态上下文中调用)来关闭此Behave。
您可以使用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()方法中,通过实例化名为 Group 的类来创建一个组对象,该类属于包javafx.scene,如下所示。
Group root = new Group();
第 3 步:创建场景对象
通过实例化属于javafx.scene包的名为Scene的类来创建场景。向此类传递在上一步中创建的Group 对象(根) 。
除了根对象之外,您还可以将表示屏幕高度和宽度的两个双精度参数与 Group 类的对象一起传递,如下所示。
Scene scene = new Scene(root,600, 300);
第四步:设置舞台标题
您可以使用Stage类的setTitle()方法设置舞台的标题。PrimaryStage是一个 Stage 对象,它作为参数传递给场景类的 start 方法。
使用primaryStage对象,将场景的标题设置为示例应用程序,如下所示。
primaryStage.setTitle("Sample Application");
第 5 步:将场景添加到舞台
您可以使用名为Stage的类的setScene()方法将 Scene 对象添加到舞台。使用此方法添加前面步骤中准备的 Scene 对象,如下所示。
primaryStage.setScene(scene);
第6步:显示舞台内容
使用Stage类的show()方法显示场景的内容,如下所示。
primaryStage.show();
第 7 步:启动应用程序
通过从 main 方法调用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 步:设置线路属性
通过使用各自的 setter 方法设置属性startX、startY、endX和endY来指定在 XY 平面上绘制线条的坐标,如以下代码块所示。
line.setStartX(100.0); line.setStartY(150.0); line.setEndX(500.0); line.setEndY(150.0);
第 4 步:创建组对象
在start()方法中,通过实例化名为Group的类来创建一个组对象,该类属于包javafx.scene。
将上一步中创建的 Line(节点)对象作为参数传递给 Group 类的构造函数,以便将其添加到组中,如下所示 -
Group root = new Group(line);
第 5 步:创建场景对象
通过实例化属于javafx.scene包的名为Scene的类来创建场景。将上一步中创建的Group 对象(根)传递给此类。
除了根对象之外,您还可以将表示屏幕高度和宽度的两个双精度参数与 Group 类的对象一起传递,如下所示。
Scene scene = new Scene(group ,600, 300);
第6步:设置舞台标题
您可以使用Stage类的setTitle()方法设置舞台的标题。PrimaryStage是一个 Stage 对象,它作为参数传递给场景类的 start 方法。
使用primaryStage对象,将场景的标题设置为示例应用程序,如下所示。
primaryStage.setTitle("Sample Application");
第7步:将场景添加到舞台
您可以使用名为Stage的类的setScene()方法将 Scene 对象添加到舞台。使用此方法添加前面步骤中准备的 Scene 对象,如下所示。
primaryStage.setScene(scene);
第8步:显示舞台内容
使用Stage类的show()方法显示场景的内容,如下所示。
primaryStage.show();
第 9 步:启动应用程序
通过从 main 方法调用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 步:嵌入文本
您可以通过实例化名为Text的类来将文本嵌入到 JavaFX 场景中,该类属于包javafx.scene.shape,实例化此类。
您可以通过传递要嵌入的字符串格式的文本来实例化此类,或者,您可以使用默认构造函数创建文本对象,如下所示。
//Creating a Text object Text text = new Text();
第三步:设置字体
您可以使用Text类的setFont()方法设置文本的字体。此方法接受字体对象作为参数。将给定文本的字体设置为 45,如下所示。
//Setting font to the text text.setFont(new Font(45));
第四步:设置文本的位置
您可以通过使用相应的设置方法setX()和setY()设置 X、Y 坐标来设置文本在 XY 平面上的位置,如下所示。
//setting the position of the text text.setX(50); text.setY(150);
第五步:设置要添加的文字
您可以使用 Text 类的 setText() 方法设置要添加的文本。此方法接受表示要添加的文本的字符串参数。
text.setText("Welcome to Tutorialspoint");
第 6 步:创建组对象
在start()方法中,通过实例化名为 Group 的类来创建一个组对象,该类属于包javafx.scene。
将上一步中创建的 Text(节点)对象作为参数传递给 Group 类的构造函数,以便将其添加到组中,如下所示 -
Group root = new Group(text)
第7步:创建场景对象
通过实例化属于javafx.scene包的名为Scene的类来创建场景。向此类传递在上一步中创建的Group 对象(根) 。
除了根对象之外,您还可以将表示屏幕高度和宽度的两个双精度参数与 Group 类的对象一起传递,如下所示。
Scene scene = new Scene(group ,600, 300);
第8步:设置舞台标题
您可以使用Stage类的setTitle()方法设置舞台的标题。PrimaryStage是一个 Stage 对象,它作为参数传递给场景类的 start 方法。
使用primaryStage对象,将场景的标题设置为示例应用程序,如下所示。
primaryStage.setTitle("Sample Application");
第9步:将场景添加到舞台
您可以使用名为Stage的类的setScene()方法将 Scene 对象添加到舞台。使用此方法添加前面步骤中准备的 Scene 对象,如下所示。
primaryStage.setScene(scene);
第10步:显示舞台内容
使用Stage类的show()方法显示场景的内容,如下所示。
primaryStage.show();
第 11 步:启动应用程序
通过从 main 方法调用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 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 DisplayingText.java java DisplayingText
执行时,上述程序会生成一个显示文本的 JavaFX 窗口,如下所示。