当前位置: 首页 > news >正文

javafx

JavaFX

JavaFX简介

JavaFX是一个用于创建富客户端应用程序的图形用户界面(GUI)框架。它是Java平台的一部分,从Java 8开始成为Java的标准库。

JavaFX提供了丰富的图形和多媒体功能,使开发人员能够创建具有吸引力和交互性的应用程序。它支持各种UI控件、布局和样式,以及动画、图形渲染和多媒体处理等功能。

以下是一些JavaFX的主要特点和功能:

  1. UI控件:JavaFX提供了一系列内置的UI控件,如按钮、标签、文本框、列表、表格等,以及自定义控件的能力。

  2. 布局:JavaFX支持多种布局管理器,如栈布局(StackPane)、流布局(FlowPane)、网格布局(GridPane)等,以便开发人员可以轻松地设计和排列应用程序的界面。

  3. 样式和主题:JavaFX使用CSS来定义应用程序的样式和外观。开发人员可以通过CSS样式表来自定义控件的外观,从而实现更好的界面设计。

  4. 动画和过渡效果:JavaFX提供了强大的动画和过渡效果支持,可以实现平滑的界面过渡、元素的渐变、旋转、缩放等效果,增强用户体验。

  5. 多媒体支持:JavaFX支持音频和视频播放、图像处理和渲染等多媒体功能,可以创建具有丰富多媒体内容的应用程序。

  6. 事件处理:JavaFX提供了事件模型和事件处理机制,开发人员可以通过监听和处理事件来实现应用程序的交互性。

  7. 场景图和渲染引擎:JavaFX使用场景图(scene graph)作为UI的基础结构,通过渲染引擎将场景图渲染到屏幕上。

JavaFX可以与Java语言无缝集成,可以使用Java代码或FXML(一种基于XML的语言)来创建界面。它还提供了丰富的API和工具,以支持开发人员构建跨平台的富客户端应用程序。

需要注意的是,从Java 11开始,JavaFX不再是Java标准库的一部分,而是作为一个独立的模块进行开发和发布。因此,如果您使用的是Java 11及更高版本,您需要单独下载和安装JavaFX,并将其添加到您的项目中。

Maven JavaFX 项目

new Project

mvn project

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.lihaozhe</groupId><artifactId>demo01</artifactId><version>1.0.0</version><description>JavaFX mvn project</description><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><junit.version>5.10.0</junit.version></properties><dependencies><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>${junit.version}</version><scope>test</scope></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-engine</artifactId><version>${junit.version}</version><scope>test</scope></dependency><dependency><groupId>org.openjfx</groupId><artifactId>javafx-controls</artifactId><version>17.0.8</version></dependency><dependency><groupId>org.openjfx</groupId><artifactId>javafx-fxml</artifactId><version>17.0.8</version></dependency><dependency><groupId>org.openjfx</groupId><artifactId>javafx-graphics</artifactId><version>17.0.8</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.11.0</version><configuration><source>17</source><target>17</target></configuration></plugin><plugin><groupId>org.openjfx</groupId><artifactId>javafx-maven-plugin</artifactId><version>0.0.8</version><executions><execution><!-- Default configuration for running with: mvn clean javafx:run --><id>default-cli</id><configuration><!-- 主窗口启动类为 com.lihaozhe.App --><mainClass>com.lihaozhe.App</mainClass><launcher>app</launcher><jlinkZipName>app</jlinkZipName><jlinkImageName>app</jlinkImageName><noManPages>true</noManPages><stripDebug>true</stripDebug><noHeaderFiles>true</noHeaderFiles></configuration></execution></executions></plugin></plugins></build>
</project>

JavaFX程序基本机构

主窗口启动类

com.lihaozhe.App01

package com.lihaozhe;import javafx.application.Application;
import javafx.stage.Stage;/*** @author 李昊哲* @version 1.0* @Description 主敞口启动类* @create 2023/9/3*/
public class App01 extends Application {/*** @param stage 主窗口* @throws Exception IO异常*/@Overridepublic void start(Stage stage) throws Exception {// 设置主窗口标题stage.setTitle("我爱你中国");// 显示窗口stage.show();}public static void main(String[] args) {// 父类中继承过来的静态方法启动 launch 方法会自动调用 start 方法launch(args);}
}

注意,此时直接启动会出现如下报错:

错误: 缺少 JavaFX 运行时组件, 需要使用该组件来运行此应用程序

导入JavaFX模块

从Java 11开始,JavaFX不再是Java标准库的一部分,而是作为一个独立的模块进行开发和发布。

因此,如果您使用的是Java 11及更高版本,您需要单独下载和安装JavaFX,并将其添加到您的项目中

src/main/java/module-info.java

module com.lihaozhe {requires javafx.controls;requires javafx.fxml;opens com.lihaozhe to javafx.fxml;exports com.lihaozhe;
}

module-info.java

运行主窗口类

JavaFX

JavaFX基本结构

package com.lihaozhe;import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;/*** @author 李昊哲* @version 1.0* @Description 主敞口启动类* @create 2023/9/3*/
public class App01 extends Application {/*** @param stage 主窗口* @throws Exception IO异常*/@Overridepublic void start(Stage stage) throws Exception {// 设置主窗口标题stage.setTitle("我爱你中国");// Label 标签Label label = new Label("我爱你中国,亲爱的母亲!");// BorderPane 边框布局 将编写好的标签 放在边框布局中 默认标签居中显示// 常见的布局如下:// BorderPane、StackPane、GridPane、FlowPane、SplitPane、TabPane、AnchorPane// BorderPane 提供了5个放置节点的区域:top, bottom, left, right, 和 center// HBox 横的一个一个摆// VBox 竖的一个一个摆// StackPane 新放的东西会覆盖原来的东西// GridPane 一格一格的放,可以设置行和列// FlowPane 会一行一行的摆,放不下就拐到下一行// SplitPane 能用鼠标拖动的面板// Accordion 可以翻的页面// TabPane 一个一个的标签// AnchorPane我们可以看到,每个页面里面都有AnchorPane,// 意思就跟随外面的移动,外面的往左,里面的就往左,外面的往右,里面的就往右BorderPane borderPane = new BorderPane(label);// Scene 场景 将编写好的布局 放在场景中Scene scene = new Scene(borderPane, 600, 600);// 将场景放在主窗口内stage.setScene(scene);// 显示窗口stage.show();}public static void main(String[] args) {// 父类中继承过来的静态方法启动 launch 方法会自动调用 start 方法launch(args);}
}

javafx 自定义场景

package com.lihaozhe;import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;/*** @author 李昊哲* @version 1.0* @Description 主敞口启动类* @create 2023/9/3*/
public class App02 extends Application {/*** @param stage 主窗口* @throws Exception IO异常*/@Overridepublic void start(Stage stage) throws Exception {// 设置主窗口标题stage.setTitle("我爱你中国");// Button 按钮Button button = new Button("你过来呀");// 按钮点击事件button.setOnAction(event -> {// 通过系统默认浏览器打开指定的网页getHostServices().showDocument("https://blog.csdn.net/qq_24330181");getHostServices().showDocument("https://space.bilibili.com/480308139");});// BorderPane 边框布局 将编写好的标签 放在边框布局中 默认标签居中显示// 常见的布局如下:// BorderPane、StackPane、GridPane、FlowPane、SplitPane、TabPane、AnchorPane// BorderPane 提供了5个放置节点的区域:top, bottom, left, right, 和 center// HBox 横的一个一个摆// VBox 竖的一个一个摆// StackPane 新放的东西会覆盖原来的东西// GridPane 一格一格的放,可以设置行和列// FlowPane 会一行一行的摆,放不下就拐到下一行// SplitPane 能用鼠标拖动的面板// Accordion 可以翻的页面// TabPane 一个一个的标签// AnchorPane我们可以看到,每个页面里面都有AnchorPane,// 意思就跟随外面的移动,外面的往左,里面的就往左,外面的往右,里面的就往右BorderPane borderPane = new BorderPane(button);// Scene 场景 将编写好的布局 放在场景中Scene scene = new Scene(borderPane, 600, 600);// 将场景放在主窗口内stage.setScene(scene);// 显示窗口stage.show();}public static void main(String[] args) {// 父类中继承过来的静态方法启动 launch 方法会自动调用 start 方法launch(args);}
}

BorderPane、StackPane、GridPane、FlowPane、SplitPane、TabPane、AnchorPane

Application简介

要创建JavaFX应用程序,您需要遵循以下步骤:

  1. 设置开发环境:安装Java开发工具包(JDK)和支持JavaFX开发的集成开发环境(IDE),如Eclipse、IntelliJ IDEA或NetBeans。

  2. 创建一个新的JavaFX项目:打开您的IDE并创建新的JavaFXProject。这将建立必要的项目结构和依赖关系。

  3. 创建主应用程序类:在项目内部,创建一个扩展javafx.application.application类的新类。这个类将作为JavaFX应用程序的入口点。

  4. 重写start方法:在您的主应用程序类中,重写start方法。此方法用于定义应用程序的初始UI布局和行为。

  5. 创建主阶段(primary stage)和场景(scene):在start方法中,创建一个新的javafx.stage.stage对象,该对象表示应用程序的主窗口。然后,创建一个javafx.scene.scene对象,并将其设置为舞台的场景。

  6. 设计UI:在场景内部,您可以使用JavaFX的内置UI控件或通过创建自定义控件来添加各种UI控件和元素。可以使用不同的布局管理器来排列场景中的控件。

  7. 添加事件处理:实现事件处理程序来处理用户与UI控件的交互。您可以使用setOnAction方法或其他适当的方法将事件处理程序附加到控件。

  8. 启动应用程序:在您的主方法或单独的启动器类中,调用application.slaunch方法来启动JavaFX应用程序。这将调用主应用程序类的start方法。

  9. 构建并运行应用程序:构建您的项目并运行该应用程序。您应该看到JavaFX应用程序窗口,其中包含已定义的UI和行为。

以下是一个显示Hello,JavaFX!标签的JavaFX应用程序的简单示例:

package com.lihaozhe;import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;/*** @author 李昊哲* @version 1.0* @Description* @create 2023/9/3*/
public class HelloWorldApp extends Application {@Overridepublic void start(Stage primaryStage) {Label label = new Label("Hello, JavaFX!");StackPane root = new StackPane();root.getChildren().add(label);Scene scene = new Scene(root, 300, 200);primaryStage.setTitle("Hello World");primaryStage.setScene(scene);primaryStage.show();}public static void main(String[] args) {launch(args);}
}

这是一个基本示例,但您可以通过添加更多的UI控件、事件处理和其他功能来扩展它,以创建更复杂的JavaFX应用程序。

Stage

在JavaFX中,stage 表示JavaFX应用程序中的顶级窗口。它是javafx.stage.stage类的一个实例,用作一个或多个场景的容器。

要在JavaFX中创建和使用阶段,请执行以下步骤:

  1. 创建一个stage对象:您可以使用javafx.stage.stage类创建一个新的stage对象。通常,您在javafx.application.application子类的 start() 方法中创建一个stage对象。

  2. 设置场景:要在舞台内部显示内容,需要设置场景。场景表示将在舞台内显示的内容。使用舞台对象的 setScene()方法设置场景。

  3. .设置标题:您可以使用setTitle()方法为舞台设置标题。标题将显示在窗口的标题栏中。

  4. 设置其他属性:您可以设置后台文件的各种属性,如大小、可调整大小的行为和可见性。使用“Stage”类提供的适当方法,如setWidth(), setHeight(), setResizable()show()

  5. 处理阶段事件:您可以注册事件处理程序来处理与阶段相关的事件,例如当它显示、隐藏或关闭时。使用setOn...() 方法,如setOnShown()setOnHidden()setOnCloseRequest(),将事件处理程序附加到阶段。

    以下是一个示例,演示如何在JavaFX中创建和使用阶段:

package com.lihaozhe;import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonType;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.FlowPane;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.StageStyle;import java.util.Optional;/*** @author 李昊哲* @version 1.0* @Description* @create 2023/9/3*/
public class StageExample extends Application {@Overridepublic void start(Stage primaryStage) {// Button 按钮Button button = new Button("你过来呀");BorderPane root = new BorderPane(button);// Create a scene with the root nodeScene scene = new Scene(root, 400, 300);// Set the scene for the stageprimaryStage.setScene(scene);// Set the title of the stageprimaryStage.setTitle("JavaFX Stage Example");// width,height,用于设置窗口大小primaryStage.setWidth(800);primaryStage.setHeight(600);// resizable,是否允许改变窗口大小primaryStage.setResizable(true);// x,y,用于设置窗口在桌面上显示的位置primaryStage.setX(100);primaryStage.setY(100);// 用户设置窗口的样式// 我们可以通过枚举类选择窗口样式,默认的窗口样式为“DECORATED”// 枚举类StageStyle有以下样式:// DECORATED 用纯白背景和平台装饰定义一个普通的窗口样式// UNDECORATED 定义一个窗口样式,背景为纯白,没有任何装饰//  当我们没有为Stage设置Sence时,我们在桌面上将看不到任何东西//  当我们有为Stage设置Sence时,可以看到,该窗口样式的最大特点就是,我们看不到标题、图表、隐藏按钮,全屏按钮、关闭按钮那一栏// TRANSPARENT 定义具有透明背景且没有装饰的窗口样式// UTILITY 定义具有纯白背景和用于实用程序窗口的最小平台装饰的样式// UNIFIED 使用平台装饰定义窗口样式,并消除客户端区域和装饰之间的边界。客户区背景与装修统一primaryStage.initStyle(StageStyle.DECORATED);// primaryStage.initModality(Modality.WINDOW_MODAL);// 设置窗口的图标// primaryStage.getIcons().add(new Image("https://img1.baidu.com/it/u=2865456449,2930074044&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=500"));// primaryStage.getIcons().add(new Image("file:///D:\\dev\\java\\code\\javafx\\demo01\\src\\main\\resources\\icon\\java02.png"));// 获取图标文件类路径String path = this.getClass().getResource("/icon/java02.png").getPath();// 设置协议String protocol = "file://";primaryStage.getIcons().add(new Image(protocol + path));// 按钮点击事件button.setOnAction(event -> {Stage stage = new Stage();stage.setTitle("自强不息");stage.setWidth(400);stage.setHeight(300);// 将主窗口设置为父窗口stage.initOwner(primaryStage);// Modality 模态框// NONE// WINDOW_MODAL 需要父窗口 只有父窗口不可用其它窗口可用// APPLICATION_MODAL 应用模态 只有本窗口可用其它窗口不可用stage.initModality(Modality.WINDOW_MODAL);stage.show();});// Show the stageprimaryStage.show();// 取消系统默认退出Platform.setImplicitExit(false);// Register an event handler for the close request eventprimaryStage.setOnCloseRequest(event -> {System.out.println("Closing the stage...");// 取消系统默认关闭窗口event.consume();Alert alert = new Alert(Alert.AlertType.CONFIRMATION);alert.setTitle("退出程序");alert.setHeaderText(null);alert.setContentText("是否退出程序");Optional<ButtonType> result = alert.showAndWait();if (result.get() == ButtonType.OK) {// 关闭窗口primaryStage.close();// 退出程序Platform.exit();}});}public static void main(String[] args) {launch(args);}
}

在本例中,我们使用 stage 类创建一个舞台对象,并设置一个带有标签的场景作为舞台的内容。我们设置了舞台的标题、大小和可调整大小的行为。最后,我们展示阶段并为关闭请求事件注册一个事件处理程序。

您可以通过设置舞台图标、应用CSS样式或添加动画和效果来进一步自定义舞台。

Secne

在JavaFX中,Secne 表示显示在JavaFX应用程序的窗口(阶段)内的内容。它充当组成应用程序用户界面的所有视觉元素(节点)的容器。

要在JavaFX中创建场景,需要执行以下步骤:

  1. 创建根节点:根节点是作为场景中所有其他节点的父节点的顶级节点。它可以是javafx.scene.Parent类的任何子类,如javafx.secene.layout.Panejavafx-secene.layout.GridPane。您可以将子节点添加到根节点以定义场景的布局和结构。

  2. 创建场景对象:使用javafx.scene.scene类创建新的场景对象。将根节点以及所需的场景宽度和高度作为参数传递给构造函数。

  3. 为 Stage 设置场景:要在窗口中显示场景,需要将其设置为javafx.stage.stage对象的场景。该阶段代表JavaFX的主窗口

  4. 显示stage:最后,调用stage对象上的 Show() 方法使其可见。这将在窗口内显示场景及其内容。

下面是一个示例,演示如何创建一个带有标签的简单JavaFX场景:

package com.lihaozhe;import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;/*** @author 李昊哲* @version 1.0* @Description* @create 2023/9/3*/
public class SceneExample extends Application {@Overridepublic void start(Stage primaryStage) {// 设置主窗口标题primaryStage.setTitle("我爱你中国");Button button0 = new Button("进入场景1");Button button1 = new Button("进入场景0");BorderPane borderPane0 = new BorderPane(button0);BorderPane borderPane1 = new BorderPane(button1);int width = 800;int height = 600;Scene scene0 = new Scene(borderPane0, width, height);Scene scene1 = new Scene(borderPane1, width, height);// 将场景放在主窗口内primaryStage.setScene(scene0);// 显示窗口primaryStage.show();button0.setOnAction(event -> primaryStage.setScene(scene1));button1.setOnAction(event -> primaryStage.setScene(scene0));}public static void main(String[] args) {launch(args);}
}

在本例中,我们创建一个 StackPane 作为根节点,并向其添加一个 Label 。然后,我们使用根节点创建一个场景,并将其设置为舞台的场景。最后,我们设置了舞台的标题并展示出来。

您可以通过设置场景的背景颜色、添加CSS样式或将动画和效果应用于场景中的节点来进一步自定义场景。

Node通用UI属性

package com.lihaozhe;import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;/*** @author 李昊哲* @version 1.0* @Description* @create 2023/9/3*/
public class NodeExample extends Application {@Overridepublic void start(Stage primaryStage) {Label label = new Label("Hello, JavaFX!");// 样式StringBuilder style = new StringBuilder();style.append("-fx-background-color: #FF0000;");style.append("-fx-border-color: #00FF00;");style.append("-fx-border-image-width: 3px;");label.setStyle(style.toString());// 宽度label.setPrefWidth(100);// 高度label.setPrefHeight(50);// 透明度 取值范围 0 到 1label.setOpacity(0.5);// 角度label.setRotate(30);// 内容居中显示label.setAlignment(Pos.CENTER);// 平移label.setTranslateX(50);label.setTranslateY(50);// 位置label.setLayoutX(50);label.setLayoutY(50);AnchorPane root = new AnchorPane();root.getChildren().add(label);Scene scene = new Scene(root, 300, 200);primaryStage.setTitle("Hello World");primaryStage.setScene(scene);primaryStage.show();}public static void main(String[] args) {launch(args);}
}

属性绑定与监听

package com.lihaozhe;import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;/*** @author 李昊哲* @version 1.0* @Description* @create 2023/9/3*/
public class PropertyExample extends Application {@Overridepublic void start(Stage primaryStage) {// 圆形 属性Circle circle = new Circle();circle.setCenterX(400);circle.setCenterY(300);circle.setRadius(100);circle.setStroke(Color.BLACK);circle.setFill(Color.WHITE);AnchorPane root = new AnchorPane();root.getChildren().add(circle);Scene scene = new Scene(root, 800, 600);// 圆心始终问宽度和高度一半的位置circle.centerXProperty().bind(scene.widthProperty().divide(2));circle.centerYProperty().bind(scene.heightProperty().divide(2));// 属性监听// observable 监听对象// oldValue 旧值// newValue 新值circle.centerXProperty().addListener((observable, oldValue, newValue) -> System.out.println(observable + "\t" + oldValue + "\t" + newValue));primaryStage.setTitle("Hello World");primaryStage.setScene(scene);primaryStage.show();}public static void main(String[] args) {launch(args);}
}

图片

package com.lihaozhe;import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;/*** @author 李昊哲* @version 1.0* @Description* @create 2023/9/3*/
public class ImageExample extends Application {@Overridepublic void start(Stage primaryStage) {// 获取图片文件类路径String path = this.getClass().getResource("/icon/java02.png").getPath();// 设置协议String protocol = "file://";Image image = new Image(protocol + path);ImageView imageView = new ImageView(image);BorderPane root = new BorderPane(imageView);Scene scene = new Scene(root, 800, 600);primaryStage.setTitle("Hello World");primaryStage.setScene(scene);primaryStage.show();}public static void main(String[] args) {launch(args);}
}

事件驱动

package com.lihaozhe;import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;/*** @author 李昊哲* @version 1.0* @Description* @create 2023/9/3*/
public class EventExample extends Application {@Overridepublic void start(Stage primaryStage) {// 获取图片文件类路径String path = this.getClass().getResource("/icon/dog.png").getPath();// 设置协议String protocol = "file://";Image image = new Image(protocol + path);ImageView imageView = new ImageView(image);imageView.setFitWidth(100);imageView.setFitHeight(100);imageView.setRotate(90);AnchorPane root = new AnchorPane(imageView);Scene scene = new Scene(root, 800, 600);primaryStage.setTitle("Hello World");// 键盘抬起scene.setOnKeyReleased(event -> {// 获取键盘事件码switch (event.getCode()) {case UP -> {imageView.setRotate(0);imageView.setLayoutY(imageView.getLayoutY() - 10);}case RIGHT -> {imageView.setRotate(90);imageView.setLayoutX(imageView.getLayoutX() + 10);}case DOWN -> {imageView.setRotate(180);imageView.setLayoutY(imageView.getLayoutY() + 10);}case LEFT -> {imageView.setRotate(270);imageView.setLayoutX(imageView.getLayoutX() - 10);}}});primaryStage.setScene(scene);primaryStage.show();}public static void main(String[] args) {launch(args);}
}

FXML布局

FXML是一种以XML的格式表示JavaFX界面对象的文件,

FXML文件中的每一个元素可以映射到JavaFX中的一个类,

每个FXML元素的属性或者其子元素都可以映射为该对应JavaFXML类的属性.

package com.lihaozhe.fxml;import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;import java.io.IOException;public class FxmlApplication extends Application {@Overridepublic void start(Stage stage) throws IOException {FXMLLoader fxmlLoader = new FXMLLoader(FxmlApplication.class.getResource("fxml-view.fxml"));Scene scene = new Scene(fxmlLoader.load(), 640, 480);stage.setTitle("Hello!");stage.setScene(scene);stage.show();}public static void main(String[] args) {launch();}
}
package com.lihaozhe.fxml;import javafx.fxml.FXML;
import javafx.scene.control.Label;
/*** 用来绑定这个fxml文件用的,用于控制这个界面的一些操作,实现一些功能*/
public class FxmlController {@FXMLprivate Label welcomeText;@FXMLprotected void onHelloButtonClick() {welcomeText.setText("Welcome to JavaFX Application!");}
}
<?xml version="1.0" encoding="UTF-8"?><?import javafx.geometry.Insets?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?><?import javafx.scene.control.Button?>
<VBox alignment="CENTER" spacing="20.0" xmlns:fx="http://javafx.com/fxml"fx:controller="com.lihaozhe.fxml.FxmlController"><padding><Insets bottom="20.0" left="20.0" right="20.0" top="20.0"/></padding><Label fx:id="welcomeText"/><Button text="Hello!" onAction="#onHelloButtonClick"/>
</VBox>

javafx

javafx

javafx

Scene Builder

Scene Builder

官网:https://openjfx.io/

中文官网:https://openjfx.cn/

Scene Builder
Scene Builder
Scene Builder
Scene Builder
Scene Builder

IDEA整合Scene Builder

javafx

javafx
javafx
javafx
Scene Builder
Scene Builder

新建 JavaFX 项目

javafx
javafx
javafx
javafx

Scene Builder
Scene Builder

initialize

controller中的initialize方法

相关文章:

javafx

JavaFX JavaFX简介 JavaFX是一个用于创建富客户端应用程序的图形用户界面&#xff08;GUI&#xff09;框架。它是Java平台的一部分&#xff0c;从Java 8开始成为Java的标准库。 JavaFX提供了丰富的图形和多媒体功能&#xff0c;使开发人员能够创建具有吸引力和交互性的应用程…...

玩转贝启科技BQ3588C开源鸿蒙系统开发板 —— 编译构建及此过程中的踩坑填坑(3)

接前一篇文章&#xff1a;玩转贝启科技BQ3588C开源鸿蒙系统开发板 —— 编译构建及此过程中的踩坑填坑&#xff08;2&#xff09; 上一篇文章结束时在等待提示的各依赖包下载安装后的编译结果&#xff0c;但是很遗憾&#xff0c;编译并没有最终完成&#xff0c;既未成功也没有失…...

SQL ORDER BY 关键字

ORDER BY 关键字用于对结果集进行排序。 SQL ORDER BY 关键字 ORDER BY 关键字用于对结果集按照一个列或者多个列进行排序。 ORDER BY 关键字默认按照升序对记录进行排序。如果需要按照降序对记录进行排序&#xff0c;您可以使用 DESC 关键字。 SQL ORDER BY 语法 SELECT …...

多线程-生产者消费者模型

一、基本信息 1、场景介绍&#xff1a;厨师和吃货的例子&#xff0c;吃货吃桌子上的面条&#xff0c;吃完让厨师做&#xff0c;厨师做完面条放桌子上&#xff0c;让吃货吃&#xff0c;厨师如果发现桌子上有面条&#xff0c;就不做&#xff0c;吃货发现桌子上没有面条就不吃。 …...

解压命令之一 gzip

文章目录 解压命令之一 gzip更多信息 解压命令之一 gzip gzip用于对后缀为gz文件进行解压&#xff1a; $ gzip -d data.gz这个命令将解压examplefile.gz&#xff0c;并且在当前目录下生成一个名为data的解压后的文件。 但特别需要留意的是&#xff0c;这个操作会删除源文件&…...

力扣:438. 找到字符串中所有字母异位词 题解

Problem: 438. 找到字符串中所有字母异位词 438. 找到字符串中所有字母异位词 预备知识解题思路复杂度Code其它细节推荐博客或题目博客题目滑动窗口哈希表 预备知识 此题用到了双指针算法中的滑动窗口思想&#xff0c;以及哈希表的运用。c中是unordered_map。如果对此不了解的u…...

QT 高DPI解决方案

一、根据DPI实现动态调整控件大小&#xff08;三种方式&#xff09; 1、QT支持高DPI&#xff08;针对整个进程中所有的UI&#xff09; // main函数中 QApplication::setAttribute(Qt::AA_EnableHighDpiScaling)tips&#xff1a;&#xff08;1&#xff09;如果不想全局设置&am…...

SLB、DMZ、Nginx、Ingress、Gateway、Kibana和Grafana

SLB、DMZ、Nginx、Ingress、Gateway、Kibana和Grafana虽然有一些相似之处&#xff0c;但是它们的功能和适用场景还是有所不同。 SLB主要用于将大流量的请求分配到多个服务器上进行处理&#xff0c;从而提高系统的可伸缩性和可靠性。它适用于需要处理大流量的应用&#xff0c;如…...

【已解决】Invalid bound statement (not found)

报错讯息 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.casey.mapper.SysRoleMapper.getUserRoleCode at org.apache.ibatis.binding.MapperMethod S q l C o m m a n d . < i n i t > ( M a p p e r M e t h o d . j a v a :…...

汽车信息安全--芯片厂、OEM安全启动汇总(1)

目录 1.芯驰E3安全启动 2.STM32 X-CUBE-SBSFU 3.小米澎湃OS安全启动 4.小结 我在前篇文章里详细记录了车规MCU信息安全设计过程关于网络安全架构的思考过程,从芯片原厂、供应商、OEM等角度思考如何建立起完备的信任链; 不过这思考过程仅仅只是一家之言,因此我又对比了国…...

气膜建筑:舒适、智能、可持续

气膜建筑之所以能够拥有广阔的发展空间&#xff0c;源于其融合了诸多优势特点&#xff0c;使其成为未来建筑领域的前沿趋势。 气膜建筑注重环境可持续性和能源效率。在材料和设计上&#xff0c;它采用可回收材料、提高热保温效果&#xff0c;并积极利用太阳能等可再生能源&…...

【C语言】一种状态超时阻塞循环查询的办法

【C语言】一种状态超时阻塞循环查询的办法 文章目录 【C语言】一种状态超时阻塞循环查询的办法1.方法12.方法21.方法1 static void wait_notify_async(notify_type_t notify_type) {static rt_tick_t exit_tick;exit_tick = rt_time_get_msec();lb_int32 notify_success = RT_F…...

【leetcode】力扣热门之回文链表【简单难度】

题目描述 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 用例 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true 输入&#xff1a;head [1,2] 输出&#xff1a;f…...

【MySQL】ALL函数的巧用 以及 排序(order by)巧用 sum(条件表达式) 语法

力扣题 1、题目地址 578. 查询回答率最高的问题 2、模拟表 SurveyLog 表&#xff1a; Column NameTypeidintactionENUMquestion_idintanswer_idintq_numinttimestampint 这张表可能包含重复项。action 是一个 ENUM(category) 数据&#xff0c;可以是 “show”、“answer”…...

Debezium发布历史49

原文地址&#xff1a; https://debezium.io/blog/2019/02/19/reliable-microservices-data-exchange-with-the-outbox-pattern/ 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. 使用发件箱模式进行可靠的微服务数…...

数据结构——队列(Queue)

目录 1.队列的介绍 2.队列工程 2.1 队列的定义 2.1.1 数组实现队列 2.1.2 单链表实现队列 2.2 队列的函数接口 2.2.1 队列的初始化 2.2.2 队列的数据插入&#xff08;入队&#xff09; 2.2.3 队列的数据删除&#xff08;出队&#xff09; 2.2.4 取队头数据 2.2.5 取队…...

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -后端架构搭建

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…...

两种方式实现mysql截取年月日

select date_format(now(), %Y-%m-%d) select substring(now(), 1, 10)...

WPF 使用矢量字体图标

矢量字体图标 在WPF项目中经常需要显示图标&#xff0c;但是项目改动后&#xff0c;有时候需要替换和修改图标&#xff0c;这样非常麻烦且消耗开发和美工的时间。为了快速开发项目&#xff0c;节省项目时间&#xff0c;使用图标矢量字体图标是一个非常不错的选择。 矢量字体图标…...

编程语言的语法糖,你了解多少?

什么是语法糖 语法糖是一种编程语言的特性&#xff0c;通常是一些简单的语法结构或函数调用&#xff0c;它可以通过隐藏底层的复杂性&#xff0c;并提供更高级别的抽象&#xff0c;从而使代码更加简洁、易读和易于理解&#xff0c;但它并不会改变代码的执行方式。 为什么需要语…...

MySQL中FLUSH TABLES命令语法

在MySQL中&#xff0c;FLUSH TABLES 命令的作用是刷新表。当你使用 FLUSH TABLES 命令的具体选项时&#xff08;例如 FLUSH TABLES WITH READ LOCK&#xff09;&#xff0c;该选项必须是在 FLUSH 语句中唯一指定的命令。即&#xff0c;在一个 FLUSH 语句中&#xff0c;你只能使…...

如何在小米4A刷OpenWRT系统并通过cpolar实现公网访问本地路由器

文章目录 前言1. 安装Python和需要的库2. 使用 OpenWRTInvasion 破解路由器3. 备份当前分区并刷入新的Breed4. 安装cpolar内网穿透4.1 注册账号4.2 下载cpolar客户端4.3 登录cpolar web ui管理界面4.4 创建公网地址 5. 固定公网地址访问 前言 OpenWRT是一个高度模块化、高度自…...

Spring学习之——事务控制

Spring中的事务控制 说明&#xff1a; JavaEE体系进行分层开发&#xff0c;事务处理位于业务层&#xff0c;Spring提供了分层设计业务层的事务处理解决方案。 Spring框架为我们提供了一组事务控制的接口。具体在后面的小节介绍。这组接口是在spring-tx.RELEASE.jar中。 spri…...

云原生技术专题 | 解密2023年云原生的安全优化升级,告别高危漏洞、与数据泄露说“再见”(安全管控篇)

背景介绍 2023年&#xff0c;我们见证了科技领域的蓬勃发展&#xff0c;每一次技术革新都为我们带来了广阔的发展前景。作为后端开发者&#xff0c;我们深受其影响&#xff0c;不断迈向未来。 随着数字化浪潮的席卷&#xff0c;各种架构设计理念相互交汇&#xff0c;共同塑造了…...

如何启用Windows电脑的内置Administrator账户

前言 不知道从什么时候开始&#xff0c;新电脑或者新系统开机之后都会出现一个界面让你创建一个账户&#xff0c;但这个账户有可能是本地账户&#xff08;Windows10&#xff09;还有强制你登录微软账户的&#xff08;Windows11&#xff09;。 好像曾经熟悉的电脑Administrator…...

智慧工厂:科技与制造融合创新之路

随着科技的迅猛发展&#xff0c;智慧工厂成为制造业领域的热门话题。智慧工厂利用先进的技术和智能化系统&#xff0c;以提高生产效率、降低成本、增强产品质量和灵活性为目标&#xff0c;正在引领着未来制造业的发展。 智慧工厂的核心是数字化和自动化生产&#xff0c;相较于传…...

SCADE—产品级安全关键系统的MBD开发套件

产品概述 随着新能源三电、智能驾驶等新技术的应用&#xff0c;汽车中衍生出很多安全关键零部件&#xff0c;如BMS、VCU、MCU、ADAS等&#xff0c;相应的软件在汽车中的比重越来越大&#xff0c;并且安全性、可靠性要求也越来越高。ANSYS主要针对安全关键零部件的嵌入式产品级软…...

PyTorch|保存与加载自己的模型

训练好一个模型之后&#xff0c;我们往往要对其进行保存&#xff0c;除非下次用时想再次训练一遍。 下面以一个简单的回归任务来详细讲解模型的保存和加载。 来看这样一组数据&#xff1a; xtorch.linspace(-1,1,50)xx.view(50,1)yx.pow(2)0.3*torch.rand(50).view(50,1) 画…...

javaScript:Math工具类方法

1 Math工具类方法: >和其他的类的不同&#xff0c;Math并不是一个构造函数&#xff0c;也就是无法通过new来创建Math的实例 >Math表示的数学&#xff0c;在Math对象中存储了一组数学运算相关的常量的和方法 >这些常量和方法可以直接通过Math来访问 >比如Math.P…...

ffmpeg转码新技能

ffmpeg转码新技能 mp3转wavmp4转gif mp3转wav 今天发现之前用ffmpeg转码不好使了。今天发现一个ffmpeg转码新的用法非常简单 ffmpeg -i 0104.mp3 -f wav 0104.wav mp4转gif 同学求助将mp4转gif。我先用剪影把mp4的多余黑边去除。然后用ffmpeg将mp4转出了gif ffmpeg -i shu…...

中国自适应网站建设/短链接在线生成免费

数组&#xff1a;是将元素在内存中连续存储的&#xff1b;它的优点&#xff1a;因为数据是连续存储的&#xff0c;内存地址连续&#xff0c;所以在查找数据的时候效率比较高&#xff1b;它的缺点&#xff1a;在存储之前&#xff0c;我们需要申请一块连续的内存空间&#xff0c;…...

今日头条网站用什么做的/外贸平台自建站

Part.1 开篇 队名&#xff1a;彳艮彳亍团队 组长博客&#xff1a;戳我进入 作业博客&#xff1a;班级博客本次作业的链接 Part.2 成员汇报 组员1:&#xff08;组长&#xff09;柯奇豪 过去两天完成了哪些任务 部分代码的整合编辑及标注的提交操作展示GitHub当日代码/文档签入记…...

淘客网站推广怎么做/网络公关公司联系方式

1 /**2 * 3 * Title: getDoctorProfit 4 * Description: 获取当日的利润明细(已付款以后的状态,包含当日总计)5 * author: lijunwei6 * date 2018年8月25日 下午3:35:247 * param queryDate8 * param doctorid9 * return Map<Stri…...

电脑网站打不开了但是有网/搜索引擎网站大全

开发项目时候需要用到tableview左滑删除&#xff0c;就研究了一下&#xff0c;话不多说直接上代码 //设Cell可编辑 - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {return YES; } //设置删除按钮 -(UITableViewCellEditingStyl…...

自学网站建设与网页设计/百度知道首页登录入口

点击上方“JAVAandPython君”&#xff0c;选择“星标”公众号重磅干货&#xff0c;第一时间送达小白学Django系列&#xff1a;小白学Django第一天| MVC、MVT以及Django的那些事小白学Django第二天| Django原来是这么玩的&#xff01;小白学Django第三天| 一文带你快速理解模型M…...

网站录入信息 前台查询功能怎么做/seo引擎优化平台培训

广东科技报讯(记者 刘肖勇 通讯员 韩战锋)8月4日&#xff0c;为期三天的“第三届粤港澳大湾区机器人大赛暨第十届亚洲机器人锦标赛中国选拔赛南大区赛”(以下简称“第三届粤港澳大湾区机器人大赛”)在香港中文大学(深圳)礼文楼隆重开幕&#xff0c;深圳市科学技术协会党组书记林…...