一、JavaFX简介
JavaFX是一个强大的图形和多媒体处理工具包集合,它允许开发者来设计、创建、测试、调试和部署富客户端程序,并且和Java一样跨平台。
JavaFX发展历史
2008年12月05日,Sun微系统公司正式发布了基于Java语言的平台JavaFX 1.0。因为当时富互联网应用(RIA,Rich Internet Application)正火,具有代表性的有:Adobe公司的Flex,微软的Silverlight和Oracle的JavaFX,还有HTML5+CSS3+JavaScript组合。
JavaFX 1.0的时候开发者需使用一种名为JavaFX Script的静态的、声明式的编程语言来开发JavaFX应用程序。JavaFX 2.0之后的版本摒弃了JavaFX Script语言,而作为一个Java API来使用。因此使用JavaFX平台实现的应用程序将直接通过标准Java代码来实现。
从JDK 7u6开始,JavaFX被内置到Java SE中,原来如果要开发JavaFX程序,需要单独下载JavaFX的SDK,但是现在不需要了。从Java 8开始,JavaFX的版本也更新为JavaFX 8。
二、环境准备
1. 开发环境要求
- JDK 8+:JavaFX从JDK 8开始内置,无需额外安装
- IDE:推荐使用IntelliJ IDEA或Eclipse(需安装e(fx)clipse插件)
- 构建工具:Maven或Gradle(可选)
2. 创建Maven工程
在IntelliJ IDEA中创建Maven工程,项目结构如下:
在pom.xml中添加JavaFX依赖:
<dependencies><dependency><groupId>org.openjfx</groupId><artifactId>javafx-controls</artifactId><version>18.0.1</version></dependency><dependency><groupId>org.openjfx</groupId><artifactId>javafx-fxml</artifactId><version>18.0.1</version></dependency></dependencies>三、HelloWorld程序
1. 程序结构
一个最基本的JavaFX程序包含以下核心组件:
| 组件 | 说明 |
|---|---|
Application | 程序的入口基类 |
Stage | 顶层窗口容器 |
Scene | 场景,包含所有内容 |
Node | 场景中的各种UI元素 |
Stage与Scene的关系如下图所示:
2. 代码实现
创建HelloJavaFX.java:
packagecn.tzy;importjavafx.application.Application;importjavafx.scene.Scene;importjavafx.scene.control.Label;importjavafx.scene.layout.StackPane;importjavafx.stage.Stage;publicclassHelloJavaFXextendsApplication{@Overridepublicvoidstart(StageprimaryStage){// 创建一个Label控件Labellabel=newLabel("Hello, JavaFX!");// 创建一个布局容器,将Label放入其中StackPaneroot=newStackPane();root.getChildren().add(label);// 创建场景,设置宽高Scenescene=newScene(root,400,300);// 设置窗口标题primaryStage.setTitle("我的第一个JavaFX程序");primaryStage.setScene(scene);primaryStage.show();}publicstaticvoidmain(String[]args){launch(args);}}3. 代码解析
(1)继承Application类
每个JavaFX应用程序的主类都需要继承javafx.application.Application类,并重写start()方法。start()方法是所有JavaFX应用程序的入口点。
(2)Stage和Scene
Stage:相当于一个窗口,是JavaFX应用程序的顶层容器Scene:场景,包含所有的UI内容,需要设置到Stage上
(3)布局容器
StackPane是一种布局容器,它会将子节点堆叠在一起并居中显示。JavaFX提供了多种布局容器:
BorderPane:边界布局HBox/VBox:水平/垂直盒子布局GridPane:网格布局FlowPane:流式布局
(4)launch()方法
main()方法中调用launch(args)来启动JavaFX应用程序,它会自动调用start()方法。
四、运行效果
编译并运行程序后,会弹出一个窗口:
窗口大小为400x300像素,Label文本居中显示。也可以添加按钮等更多控件:
五、使用FXML分离界面与逻辑
在实际开发中,我们通常使用FXML文件来描述界面布局,将UI设计与业务逻辑分离。
1. 创建FXML文件
创建hello.fxml:
<?xml version="1.0" encoding="UTF-8"?><?import javafx.scene.control.Button?><?import javafx.scene.control.Label?><?import javafx.scene.layout.VBox?><VBoxxmlns="http://javafx.com/javafx/8.0.112"xmlns:fx="http://javafx.com/fxml/1"fx:controller="cn.tzy.HelloController"alignment="CENTER"spacing="10"><Labeltext="Hello, JavaFX with FXML!"/><Buttontext="Click Me"onAction="#handleButtonClick"/></VBox>2. 使用Scene Builder可视化编辑
FXML文件可以通过JavaFX Scene Builder进行可视化拖拽编辑:
3. 创建Controller类
创建HelloController.java:
packagecn.tzy;importjavafx.fxml.FXML;importjavafx.scene.control.Button;importjavafx.event.ActionEvent;publicclassHelloController{@FXMLprivateButtonbutton;@FXMLpublicvoidhandleButtonClick(ActionEventevent){Buttonbtn=(Button)event.getSource();btn.setText("I am clicked!");}}4. 修改主程序
packagecn.tzy;importjavafx.application.Application;importjavafx.fxml.FXMLLoader;importjavafx.scene.Parent;importjavafx.scene.Scene;importjavafx.stage.Stage;publicclassMainAppextendsApplication{@Overridepublicvoidstart(StageprimaryStage)throwsException{Parentroot=FXMLLoader.load(getClass().getResource("/hello.fxml"));Scenescene=newScene(root,400,300);primaryStage.setTitle("JavaFX FXML示例");primaryStage.setScene(scene);primaryStage.show();}publicstaticvoidmain(String[]args){launch(args);}}六、添加CSS样式
JavaFX支持使用CSS来美化界面,创建application.css:
.root{-fx-font-size:14px;-fx-font-family:"Helvetica, Arial, sans-serif";-fx-background-color:#f0f0f0;}.button{-fx-background-color:#4CAF50;-fx-text-fill:white;-fx-padding:10px 20px;}.button:hover{-fx-background-color:#45a049;}在代码中引入CSS:
scene.getStylesheets().add(getClass().getResource("/application.css").toExternalForm());