查询jdk版本:
在小黑屏中输入 java -version
什么是JavaFX?
javaFX是用于构建富Internet应用程序的Java库。
- JavaFX提供了一种声明式的用户界面描述语言FXML,可以将界面和逻辑代码分离,提高了代码的可读性和可维护性。
- 它还支持CSS样式表,使得界面的外观和风格可以轻松定制。
- JavaFX提供了丰富的图形和媒体API,并通过硬件加速图形利用现代Graphical Processing Unit 。
- JavaFX还提供了接口,开发人员可以使用这些接口组合图形动画和UI控件。
使用此库编写的应用程序可以跨多个平台一致地运行。 使用JavaFX开发的应用程序可以在各种设备上运行,如台式电脑,手机,电视,平板电脑等。
在Java早期,程序员主要依赖于Advanced Windowing Toolkit (AWT) 和Swing等库来创建用户界面。这些库提供了一些基本的GUI组件和功能,但在某些方面可能缺乏一些现代化的特性和样式。
然而,随着JavaFX的出现,Java程序员现在可以使用JavaFX来开发GUI应用程序。
javafx架构
javafx.animation
- 包含用于向JavaFX节点添加基于过渡的动画(如填充,淡入淡出,旋转,缩放和平移)的类。
javafx.application
- 包含一组负责JavaFX应用程序生命周期的类。
javafx.css
- 包含用于向JavaFX GUI应用程序添加类似CSS样式的类。
javafx.event
- 包含用于传递和处理JavaFX事件的类和接口。
javafx.geometry
- 包含用于定义2D对象并对其执行操作的类。
javafx.stage
- 此包包含JavaFX应用程序的顶级容器类。
javafx.scene
- 此包提供了支持场景图的类和接口。 此外,它还提供了子包,如画布,图表,控件,效果,图像,输入,布局,媒体,绘画,形状,文本,转换,Web等。有几个组件支持JavaFX丰富的API
舞台
在JavaFX中,"舞台"(Stage)是JavaFX应用程序的顶级容器,它代表了应用程序的窗口。它承载了一个或多个场景(Scene),并提供窗口的外观和行为控制,如标题、大小、图标等。
每个JavaFX应用程序都必须至少包含一个舞台。
舞台是JavaFX应用程序中的顶级容器,用于承载一个或多个场景(Scene)。舞台提供了应用程序窗口的外观和行为,包括标题、大小、图标、关闭按钮等。
以下是一些关于舞台的重要概念和使用方法:
- 创建舞台:
Stage primaryStage = new Stage(); ``` 使用`new Stage()`语句创建一个新的舞台对象。
- 设置舞台属性:
primaryStage.setTitle("My Application"); primaryStage.setWidth(800); primaryStage.setHeight(600); ``` 使用`setTitle()`方法设置舞台的标题,使用`setWidth()`和`setHeight()`方法设置舞台的宽度和高度。
- 设置舞台图标:
Image icon = new Image("icon.png"); primaryStage.getIcons().add(icon); ``` 使用`getIcons().add()`方法添加舞台的图标。图标可以是`javafx.scene.image.Image`对象,也可以是图像文件的URL或文件路径。
- 设置舞台场景:
Scene scene = new Scene(rootNode, width, height); primaryStage.setScene(scene); ``` 创建一个场景对象,并使用`setScene()`方法将场景设置为舞台的场景。场景定义了应用程序窗口中的可视化内容。
- 显示舞台:
primaryStage.show(); ``` 使用`show()`方法显示舞台,使其可见。
- 关闭舞台:
primaryStage.close(); ``` 使用`close()`方法关闭舞台,结束应用程序。
场景
在JavaFX中,"场景"(Scene)是JavaFX应用程序中的一个重要概念。场景代表了应用程序窗口中的一个可视化区域,它是JavaFX界面的容器。
每个JavaFX应用程序至少包含一个场景,而且每个场景都有一个根节点(Root Node)。根节点是场景中的顶级容器,承载了所有其他节点,并确定它们在场景中的布局和层次关系。
以下是一些关于场景的重要概念和使用方法:
- 创建场景:
Scene scene = new Scene(rootNode, width, height); ``` 通过指定根节点、宽度和高度来创建一个场景对象。根节点是场景中的顶级容器,宽度和高度定义了场景的大小
- 设置场景:
primaryStage.setScene(scene); ``` 将创建好的场景设置为主舞台(`primaryStage`)的场景。主舞台是JavaFX应用程序窗口的顶级容器。
- 获取根节点:
Parent rootNode = scene.getRoot(); ``` 通过调用`getRoot()`方法,可以获取场景中的根节点。
- 获取场景尺寸:
double width = scene.getWidth(); double height = scene.getHeight(); ``` 使用`getWidth()`和`getHeight()`方法,可以获取场景的宽度和高度。
- 处理场景事件:
scene.setOnMouseClicked(event -> { // 处理鼠标点击事件 }); ``` 使用`setOn<Event>()`方法,可以为场景注册事件处理程序,例如处理鼠标点击、键盘按键等事件。
- 切换场景:
primaryStage.setScene(newScene); ``` 通过将新的场景对象设置为主舞台的场景,可以切换到另一个场景。
场景是JavaFX应用程序中的核心组件之一,它定义了应用程序窗口中的可视化内容。通过创建和管理场景,可以实现界面布局、事件处理和场景切换等功能。场景的根节点承载了所有其他节点,并决定了它们在场景中的布局和层次关系。
根节点:
根节点是场景(Scene)中的顶级容器,它充当了所有其他节点的容器。根节点可以是任何继承自javafx.scene.Parent类的节点,如布局容器(Pane类的子类),例如StackPane、BorderPane、VBox、HBox等,或者是Group(组节点)。
应用程序的界面结构可以通过以下几个重要的关系来描述:
-
舞台(Stage)和场景(Scene)之间的关系:JavaFX应用程序的顶级容器是舞台(Stage),它代表了应用程序的主窗口。每个舞台可以包含一个或多个场景(Scene),场景定义了应用程序的可视化内容。一个舞台可以在不同的时间点显示多个场景,通过调用
Stage
类的setScene(Scene scene)
方法可以改变当前显示的场景。 -
场景(Scene)和根节点(Root Node)之间的关系:每个场景都有一个根节点,根节点是一个
Node
对象,它可以是任何继承自Node
的类。根节点是场景的根容器,其他可视化节点可以添加到根节点上。通过调用
Scene
类的setRoot(Node root)
方法可以设置场景的根节点。 -
父节点(Parent Node)和子节点(Child Node)之间的关系:在JavaFX中,节点之间可以形成父子关系。父节点可以包含一个或多个子节点,这种关系可以嵌套多层。通过调用父节点的
getChildren()
方法可以获取其子节点的列表。子节点可以通过调用父节点的getChildren().add(Node child)
方法添加到父节点中。 -
布局容器(Layout Container)和节点之间的关系:JavaFX提供了多个布局容器,用于管理和控制节点的布局和位置。常见的布局容器包括
VBox
、HBox
、StackPane
、BorderPane
等。布局容器可以包含其他节点作为其子节点,并根据特定的布局规则来排列和定位这些子节点。
事件
当特定事件发生时,事件处理程序会被调用或执行,以执行预定义的操作或逻辑。这些事件可以是用户点击按钮、键盘按键、鼠标移动或点击、窗口关闭等等。通过为这些事件注册事件处理程序,我们可以指定在事件发生时应该执行的操作。
事件类型
这些事件大致可分为以下两类 -
- Foreground Events
- 需要用户直接交互的事件。 它们是作为人与图形用户界面中的图形组件交互的结果而生成的。 例如,单击按钮,移动鼠标,通过键盘输入字符,从列表中选择项目,滚动页面等。
- Background Events
- 需要最终用户交互的事件称为后台事件。 操作系统中断,硬件或软件故障,计时器到期,操作完成是后台事件的示例。
JavaFX中的事件
JavaFX提供了处理各种事件的支持。 包javafx.event名为Event的类是事件的基类。
它的任何子类的实例都是一个事件。
举例如下:
- Mouse Event - 这是单击鼠标时发生的输入事件。 它由名为MouseEvent的类表示。 它包括鼠标单击,鼠标按下,鼠标释放,鼠标移动,鼠标输入目标,鼠标退出目标等操作。
- Key Event - 这是一个输入事件,指示节点上发生的键击。 它由名为KeyEvent的类表示。 此事件包括按下键,释放键和键入键等操作。
- Drag Event - 这是拖动鼠标时发生的输入事件。 它由名为DragEvent的类表示。 它包括拖动输入,拖放,拖动输入目标,拖动退出目标,拖动等操作。
- Window Event - 这是与窗口显示/隐藏操作相关的事件。 它由名为WindowEvent的类表示。 它包括窗口隐藏,显示窗口,隐藏窗口,窗口显示等操作。
事件处理
事件处理是控制事件并决定事件发生时应该发生什么的机制。 此机制具有代码,该代码称为事件发生时执行的事件处理程序。
JavaFX提供处理程序和过滤器来处理事件。 在JavaFX中,每个事件都有 -
- Target
- 发生事件的节点。 目标可以是窗口,场景和节点。
- Source
- 生成事件的源将是事件的来源。 在上面的场景中,鼠标是事件的来源。
- Type
- 发生事件的类型; 在鼠标事件的情况下 - 鼠标按下或者鼠标释放是事件的类型。
假设我们有一个应用程序,它使用组对象插入Circle,Stop和Play Buttons,如下所示 -
如果单击播放按钮,源将是鼠标,目标节点将是播放按钮,生成的事件类型是鼠标单击。
JavaFX 提供了一套强大的事件处理机制,用于处理用户界面中的各种事件,例如鼠标点击、键盘输入、控件操作等。下面是一些常见的 JavaFX 事件处理的示例和说明:
1. 使用事件处理接口
JavaFX 提供的事件处理器接口,用于处理特定类型的事件。你可以new一个事件处理器的实例,并实现其 handle 方法来定义事件触发时的行为。
例如,处理按钮点击事件可以使用 ActionEvent 和 EventHandler 接口:
Button button = new Button("Click me");
button.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("Button clicked");
}
});
在这个示例中,创建了一个按钮对象 button,然后使用 setOnAction() 方法注册一个事件处理器 EventHandler,并在方法的 handle() 中处理按钮点击事件。
2. 使用 Lambda 表达式
Java 8 引入了 Lambda 表达式,可以简化事件处理的代码。使用 Lambda 表达式,上面的示例可以改写为:
Button button = new Button("Click me");
button.setOnAction(event -> System.out.println("Button clicked"));
通过使用 Lambda 表达式,我们可以直接将事件处理的逻辑作为一个简洁的代码块传递给 setOnAction() 方法。
3. FXML 中的事件处理
在使用 FXML 文件定义用户界面时,可以在控制器类中使用注解 @FXML 和 @FXMLEventHandler 来声明和处理事件。例如,在 FXML 文件中定义了一个按钮,可以在控制器类中添加一个方法来处理按钮点击事件:
public class MyController {
@FXML
private Button button;
@FXML private void handleButtonClick(ActionEvent event) {
System.out.println("Button clicked");
}
}
在这个示例中,@FXML 注解用于将 FXML 文件中定义的按钮对象与控制器类中的 button 属性进行关联。然后,使用 @FXML 注解和事件处理方法的签名来声明和处理按钮点击事件。
事件处理阶段
每当生成事件时,JavaFX都会经历以下阶段。
路线建设
每当生成事件时,事件的默认/初始路由由构建Event Dispatch chain 。 它是从阶段到源节点的路径。
以下是当我们点击上述场景中的播放按钮时生成的事件的事件调度链。
1.事件捕获阶段
在构建事件调度链之后,应用程序的根节点将调度该事件。 此事件将传递到调度链中的所有节点(从上到下)。 如果这些节点中的任何节点具有为生成的事件注册的filter ,则将执行该filter。 如果调度链中没有节点具有生成事件的过滤器,则将其传递到目标节点,最后目标节点处理该事件。
2.事件冒泡阶段
在冒泡阶段,事件从目标节点传播到阶段节点(从下到上)。 如果事件调度链中的任何节点具有为生成的事件注册的handler ,则将执行该handler 。 如果这些节点都没有处理事件的处理程序,则事件到达根节点,最后完成该过程。
事件处理程序和过滤器
事件过滤器和处理程序包含处理事件的应用程序逻辑。 节点可以注册到多个处理程序/过滤器。 在父子节点的情况下,您可以为父节点提供公共过滤器/处理程序,它将作为所有子节点的默认处理。
如上所述,在事件期间,处理是执行的过滤器,并且在事件冒泡阶段期间,执行处理程序。 所有处理程序和过滤器都实现了包javafx.event的接口EventHandler 。
添加和删除事件过滤器
要向节点添加事件过滤器,您需要使用Node类的addEventFilter()方法注册此过滤器。
//Creating the mouse event handler
EventHandler<MouseEvent> eventHandler = new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent e) {
System.out.println("Hello World");
circle.setFill(Color.DARKSLATEBLUE);
}
};
//Adding event Filter(添加事件过滤器)
Circle.addEventFilter(MouseEvent.MOUSE_CLICKED, eventHandler);
以同样的方式,您可以使用removeEventFilter()方法删除过滤器,如下所示 -
circle.removeEventFilter(MouseEvent.MOUSE_CLICKED, eventHandler);
添加和删除事件处理程序
要向节点添加事件处理程序,需要使用Node类的addEventHandler()方法注册此处理程序,如下所示。
//Creating the mouse event handler
EventHandler<javafx.scene.input.MouseEvent> eventHandler =
new EventHandler<javafx.scene.input.MouseEvent>() {
@Override
public void handle(javafx.scene.input.MouseEvent e) {
System.out.println("Hello World");
circle.setFill(Color.DARKSLATEBLUE);
}
};
//Adding the event handler
circle.addEventHandler(javafx.scene.input.MouseEvent.MOUSE_CLICKED, eventHandler);
以同样的方式,您可以使用removeEventHandler()方法删除事件处理程序,如下所示 -
circle.removeEventHandler(MouseEvent.MOUSE_CLICKED, eventHandler);
如果场景图中的任何节点注册了一个事件过滤器(event filter),那么当事件触发时,该事件过滤器会被执行。事件过滤器可以拦截事件,并在事件到达实际的事件目标之前对事件进行处理。
事件过滤器的执行顺序是从场景图的根节点开始,按照节点层次结构向下传递。当事件到达一个节点时,如果该节点注册了事件过滤器,那么过滤器会被执行。如果过滤器返回 true,表示事件已被处理,将不再传递给下一个节点。如果过滤器返回 false,则事件将继续传递给下一个节点,直到事件到达实际的事件目标。