快速学习 JavaFX 进行 GUI 应用开发

2024-06-19 16:52

本文主要是介绍快速学习 JavaFX 进行 GUI 应用开发,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

JavaFX是Java的一个用于构建丰富图形用户界面的框架。通过JavaFX,开发者可以创建功能强大、交互性强且美观的桌面应用程序。

一、JavaFX简介

1. JavaFX的历史和现状

JavaFX最初作为Java的一部分发布,旨在替代Swing作为Java的主要GUI工具包。JavaFX提供了一组丰富的GUI控件、布局管理器和图形绘制功能,支持硬件加速和高性能的用户界面。

2. JavaFX的安装和配置

要使用JavaFX,首先需要在项目中配置JavaFX库。可以通过以下步骤完成:

  • 下载并安装JDK(Java Development Kit)。
  • 下载并配置JavaFX SDK。
  • 配置IDE(如IntelliJ IDEA、Eclipse)以使用JavaFX。

以IntelliJ IDEA为例,配置JavaFX步骤如下:

  1. 创建新的Java项目。
  2. 下载JavaFX SDK并解压。
  3. 配置项目依赖:打开项目结构(Project Structure),选择模块(Modules),添加JavaFX库路径。
  4. 配置运行参数:在运行配置中添加VM选项,如--module-path /path/to/javafx-sdk/lib --add-modules javafx.controls,javafx.fxml

二、JavaFX基础

1. JavaFX应用程序结构

JavaFX应用程序通常继承自javafx.application.Application类,必须重写start(Stage primaryStage)方法。以下是一个简单的JavaFX应用程序:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;public class HelloWorld extends Application {@Overridepublic void start(Stage primaryStage) {primaryStage.setTitle("Hello World");Button btn = new Button();btn.setText("Say 'Hello World'");btn.setOnAction(event -> System.out.println("Hello World!"));StackPane root = new StackPane();root.getChildren().add(btn);Scene scene = new Scene(root, 300, 250);primaryStage.setScene(scene);primaryStage.show();}public static void main(String[] args) {launch(args);}
}
2. JavaFX中的Scene和Stage
  • Stage:JavaFX中的顶级容器,代表窗口。primaryStage是主窗口。
  • Scene:场景,包含所有的GUI组件。一个Stage可以包含一个或多个Scene,但一次只能显示一个Scene

三、JavaFX常用组件

JavaFX提供了丰富的UI控件,以下是一些常用组件:

1. 控件概述
  • Button:按钮,用于触发事件。
  • Label:标签,用于显示文本。
  • TextField:文本框,用于输入单行文本。
  • TextArea:文本区域,用于输入多行文本。
  • CheckBox:复选框,用于选择或取消选择。
  • RadioButton:单选按钮,一组单选按钮中只能选择一个。
  • ComboBox:组合框,下拉列表。
  • ListView:列表视图,显示可滚动的项目列表。
2. 使用示例

以下示例展示了如何使用这些控件:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;public class UIComponentsExample extends Application {@Overridepublic void start(Stage primaryStage) {primaryStage.setTitle("JavaFX UI Components");Label label = new Label("Label Example");Button button = new Button("Button Example");TextField textField = new TextField("TextField Example");TextArea textArea = new TextArea("TextArea Example");CheckBox checkBox = new CheckBox("CheckBox Example");RadioButton radioButton = new RadioButton("RadioButton Example");ComboBox<String> comboBox = new ComboBox<>();comboBox.getItems().addAll("Option 1", "Option 2", "Option 3");ListView<String> listView = new ListView<>();listView.getItems().addAll("Item 1", "Item 2", "Item 3");VBox vbox = new VBox(label, button, textField, textArea, checkBox, radioButton, comboBox, listView);Scene scene = new Scene(vbox, 400, 400);primaryStage.setScene(scene);primaryStage.show();}public static void main(String[] args) {launch(args);}
}

四、布局管理

JavaFX提供了多种布局管理器,用于安排和组织控件的位置和大小。

1. 常见布局管理器
  • Pane:基本的布局管理器,没有特定布局规则。
  • HBox:水平布局,将子节点排列成一行。
  • VBox:垂直布局,将子节点排列成一列。
  • BorderPane:边界布局,分为顶部、底部、左边、右边和中心区域。
  • GridPane:网格布局,以行和列的形式排列子节点。
  • StackPane:堆叠布局,将子节点堆叠在一起。
  • FlowPane:流式布局,按行或列排列子节点。
  • AnchorPane:锚点布局,可以固定子节点到容器的特定边缘。
2. 布局示例

以下示例展示了如何使用这些布局管理器:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.*;
import javafx.stage.Stage;public class LayoutExample extends Application {@Overridepublic void start(Stage primaryStage) {primaryStage.setTitle("JavaFX Layout Example");Button btn1 = new Button("Button 1");Button btn2 = new Button("Button 2");Button btn3 = new Button("Button 3");Button btn4 = new Button("Button 4");// HBoxHBox hbox = new HBox(10, btn1, btn2);// VBoxVBox vbox = new VBox(10, btn3, btn4);// BorderPaneBorderPane borderPane = new BorderPane();borderPane.setTop(new Button("Top"));borderPane.setBottom(new Button("Bottom"));borderPane.setLeft(new Button("Left"));borderPane.setRight(new Button("Right"));borderPane.setCenter(new Button("Center"));// GridPaneGridPane gridPane = new GridPane();gridPane.add(new Button("Grid 1"), 0, 0);gridPane.add(new Button("Grid 2"), 1, 0);gridPane.add(new Button("Grid 3"), 0, 1);gridPane.add(new Button("Grid 4"), 1, 1);VBox mainVBox = new VBox(20, hbox, vbox, borderPane, gridPane);Scene scene = new Scene(mainVBox, 400, 400);primaryStage.setScene(scene);primaryStage.show();}public static void main(String[] args) {launch(args);}
}

五、事件处理

事件处理是JavaFX开发中的重要部分,用于响应用户的操作。

1. 事件模型

JavaFX的事件模型基于观察者模式。事件源是触发事件的对象,事件监听器是处理事件的对象。

2. 常见事件类型
  • ActionEvent:由按钮、菜单项等触发的操作事件。
  • MouseEvent:由鼠标操作触发的事件,如点击、移动、拖动等。
  • KeyEvent:由键盘操作触发的事件,如按键按下、释放等。
3. 事件处理示例

以下示例展示了如何处理按钮点击事件和鼠标事件:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.scene.input.MouseEvent;public class EventHandlingExample extends Application {@Overridepublic void start(Stage primaryStage) {primaryStage.setTitle("JavaFX Event Handling Example");Button btn = new Button("Click Me");btn.setOnAction(event -> System.out.println("Button clicked!"));StackPane root = new StackPane();root.getChildren().add(btn);root.setOnMouseClicked(this::handleMouseClick);Scene scene = new Scene(root, 300, 250);primaryStage.setScene(scene);primaryStage.show();}private void handleMouseClick(MouseEvent event) {System.out.println("Mouse clicked at: " + event.getSceneX() + ", " + event.getSceneY());}public static void main(String[] args) {launch(args);}
}

六、样式和皮肤

JavaFX支持使用CSS(层叠样式表)来定义控件的样式,允许开发者轻松地定制应用程序的外观。

1. 使用CSS样式

可以在外部CSS文件中定义样式,并在Java代码中加载:

/* styles.css */
.button {-fx-background-color: #ff0000;-fx-text-fill: #ffffff;
}

在Java代码中加载CSS文件:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;public class CSSExample extends Application {@Overridepublic void start(Stage primaryStage) {primaryStage.setTitle("JavaFX CSS Example");Button btn = new Button("Styled Button");StackPane root = new StackPane();root.getChildren().add(btn);Scene scene = new Scene(root, 300, 250);scene.getStylesheets().add(getClass().getResource("styles.css").toExternalForm());primaryStage.setScene(scene);primaryStage.show();}public static void main(String[] args) {launch(args);}
}
2. 内联样式

也可以直接在Java代码中设置样式:

btn.setStyle("-fx-background-color: #ff0000; -fx-text-fill: #ffffff;");

七、动画和特效

JavaFX提供了丰富的动画和特效API,允许开发者创建动态和生动的用户界面。

1. 动画

JavaFX中的动画由Animation类及其子类(如TransitionTimeline等)实现。

以下示例展示了如何创建一个简单的动画:

import javafx.animation.TranslateTransition;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.util.Duration;public class AnimationExample extends Application {@Overridepublic void start(Stage primaryStage) {primaryStage.setTitle("JavaFX Animation Example");Button btn = new Button("Animate Me");TranslateTransition translateTransition = new TranslateTransition(Duration.millis(2000), btn);translateTransition.setFromX(0);translateTransition.setToX(200);translateTransition.setCycleCount(TranslateTransition.INDEFINITE);translateTransition.setAutoReverse(true);btn.setOnAction(event -> translateTransition.play());StackPane root = new StackPane();root.getChildren().add(btn);Scene scene = new Scene(root, 400, 300);primaryStage.setScene(scene);primaryStage.show();}public static void main(String[] args) {launch(args);}
}
2. 特效

JavaFX中的特效由Effect类及其子类(如DropShadowBloomGaussianBlur等)实现。

以下示例展示了如何应用阴影效果:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.effect.DropShadow;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.scene.paint.Color;public class EffectExample extends Application {@Overridepublic void start(Stage primaryStage) {primaryStage.setTitle("JavaFX Effect Example");Button btn = new Button("Shadowed Button");DropShadow dropShadow = new DropShadow();dropShadow.setColor(Color.GRAY);dropShadow.setRadius(10);btn.setEffect(dropShadow);StackPane root = new StackPane();root.getChildren().add(btn);Scene scene = new Scene(root, 300, 250);primaryStage.setScene(scene);primaryStage.show();}public static void main(String[] args) {launch(args);}
}

八、FXML和Scene Builder

JavaFX支持使用FXML(XML格式)来描述用户界面。FXML文件可以通过JavaFX Scene Builder(可视化布局工具)创建和编辑。

1. FXML文件

以下是一个简单的FXML文件示例:

<?xml version="1.0" encoding="UTF-8"?><?import javafx.scene.control.Button?>
<?import javafx.scene.layout.StackPane?><StackPane xmlns:fx="http://javafx.com/fxml" fx:controller="com.example.Controller"><Button text="Click Me" fx:id="myButton" />
</StackPane>
2. 控制器类

FXML文件中的fx:controller属性指定了控制器类,该类用于处理界面逻辑:

package com.example;import javafx.fxml.FXML;
import javafx.scene.control.Button;public class Controller {@FXMLprivate Button myButton;@FXMLprivate void initialize() {myButton.setOnAction(event -> System.out.println("Button clicked!"));}
}
3. 加载FXML文件

在Java代码中加载FXML文件:

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;public class FXMLExample extends Application {@Overridepublic void start(Stage primaryStage) throws Exception {primaryStage.setTitle("JavaFX FXML Example");Parent root = FXMLLoader.load(getClass().getResource("layout.fxml"));Scene scene = new Scene(root, 300, 250);primaryStage.setScene(scene);primaryStage.show();}public static void main(String[] args) {launch(args);}
}

黑马程序员免费预约咨询

这篇关于快速学习 JavaFX 进行 GUI 应用开发的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1075598

相关文章

Java中实现线程的创建和启动的方法

《Java中实现线程的创建和启动的方法》在Java中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用start()方法)而非直接调用run()方法,是掌握多线程编程的关键,... 目录1. 线程的生命周期2. start() vs run() 的本质区别3. 为什么必须通过 st

关于跨域无效的问题及解决(java后端方案)

《关于跨域无效的问题及解决(java后端方案)》:本文主要介绍关于跨域无效的问题及解决(java后端方案),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录通用后端跨域方法1、@CrossOrigin 注解2、springboot2.0 实现WebMvcConfig

Java SWT库详解与安装指南(最新推荐)

《JavaSWT库详解与安装指南(最新推荐)》:本文主要介绍JavaSWT库详解与安装指南,在本章中,我们介绍了如何下载、安装SWTJAR包,并详述了在Eclipse以及命令行环境中配置Java... 目录1. Java SWT类库概述2. SWT与AWT和Swing的区别2.1 历史背景与设计理念2.1.

使用SpringBoot整合Sharding Sphere实现数据脱敏的示例

《使用SpringBoot整合ShardingSphere实现数据脱敏的示例》ApacheShardingSphere数据脱敏模块,通过SQL拦截与改写实现敏感信息加密存储,解决手动处理繁琐及系统改... 目录痛点一:痛点二:脱敏配置Quick Start——Spring 显示配置:1.引入依赖2.创建脱敏

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

SpringBoot 中 CommandLineRunner的作用示例详解

《SpringBoot中CommandLineRunner的作用示例详解》SpringBoot提供的一种简单的实现方案就是添加一个model并实现CommandLineRunner接口,实现功能的... 目录1、CommandLineRunnerSpringBoot中CommandLineRunner的作用

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件

Java死锁问题解决方案及示例详解

《Java死锁问题解决方案及示例详解》死锁是指两个或多个线程因争夺资源而相互等待,导致所有线程都无法继续执行的一种状态,本文给大家详细介绍了Java死锁问题解决方案详解及实践样例,需要的朋友可以参考下... 目录1、简述死锁的四个必要条件:2、死锁示例代码3、如何检测死锁?3.1 使用 jstack3.2

Java日期类详解(最新推荐)

《Java日期类详解(最新推荐)》早期版本主要使用java.util.Date、java.util.Calendar等类,Java8及以后引入了新的日期和时间API(JSR310),包含在ja... 目录旧的日期时间API新的日期时间 API(Java 8+)获取时间戳时间计算与其他日期时间类型的转换Dur

java对接海康摄像头的完整步骤记录

《java对接海康摄像头的完整步骤记录》在Java中调用海康威视摄像头通常需要使用海康威视提供的SDK,下面这篇文章主要给大家介绍了关于java对接海康摄像头的完整步骤,文中通过代码介绍的非常详细,需... 目录一、开发环境准备二、实现Java调用设备接口(一)加载动态链接库(二)结构体、接口重定义1.类型