JavaFx教程(一) 基本概念

简介: JavaFx教程(一) 基本概念

前言

在我迈入大学的时候,我没想到第一门编程语言出来的是一个黑窗口,这让我十分失落,这让我一点动力都没有,甚至让我一度十分失落。后面我买了本C语言游戏开发,觉得蛮有意思的,但是投入精力不多,我当时的主要精力还是用在数学上。后面开了Java课程,我其实也没那么有兴致,翻到教科书后面发现有桌面开发,于是兴奋起来,但是发现Java Swing比较丑:

微信图片_20221010152025.jpg

于是放弃了学习的想法。但是偶然间发现了Java出了JavaFx,看了看界面发现长的不错,是个“标致的小姑娘”,再加上有个游戏引擎,我打算开发写点游戏玩玩,就打算简单学习一下。

javaFx 是啥?

JavaFX 是一个开源的下一代客户端应用平台,适用于基于Java构建的桌面、移动端和嵌入式系统。--- javaFx官网

所以JavaFx是一个应用平台,我们可以借助JavaFx来构建图形化应用。

从Hello World开始

JDK 11 的安装这里不再赘述,除此之外还需要一个maven archetype,第一个例子我们先跟着做。下面是安装JavaFx archetype 的脚本:

git clone https://github.com/openjfx/javafx-maven-archetypes.git
cd javafx-maven-archetypes
mvn clean install

微信图片_20221010152129.jpg

# 坐标如下
GroupId = org.openjfx
ArtifactId = javafx-archetype-simple

微信图片_20221010152203.jpg稍微解释一下,JDK 11 进行了模块化,rt这个包引入不到。

微信图片_20221010152229.jpg

就会出现一个窗口:

微信图片_20221010152232.jpg

这个maven 模板产生的java Fx 的依赖版本是 13 ,我将其改为了11。下面来解释一下这个代码:

public class App extends Application {
    @Override
    public void start(Stage stage) {
        var javaVersion = SystemInfo.javaVersion();
        var javafxVersion = SystemInfo.javafxVersion();
        var label = new Label("Hello, JavaFX " + javafxVersion + ", running on Java " + javaVersion + ".");
        var scene = new Scene(new StackPane(label), 640, 480);
        stage.setScene(scene);
        stage.show();
    }
    public static void main(String[] args) {
        launch();
    }
public class SystemInfo {
    // 获取当前Java的版本
    public static String javaVersion() {
        return System.getProperty("java.version");
    }
    // 获取当前javaFx的版本
    public static String javafxVersion() {
        return System.getProperty("javafx.version");
    }
}

出来的图形的数据结构如下所示:

微信图片_20221010152329.jpg

Stage 有舞台的意思, 可以理解为JavaFx对当前操作系统窗口的包装,Scene则有场景的意思,所以讨巧一点的理解是,javaFx的设计者将桌面开发理解为戏剧的演出,戏剧需要有舞台,而戏剧则有不同的场景,不同的场景有不同的布置,在上面的“hello world”这个小戏剧中,我们上面只摆了StackPane,StackPane上放了Label。上面是一种比较简单的数据结构图,更为通用的如下:

微信图片_20221010152332.jpg

直接或者间接依附于Scene的元素,统称为Scene Graph,这里将这个词译为场景图,其实看到Graph,我想到的是数据结构里面的图,觉得这个翻译不合适,但是又找不出太好的译名,就姑且用这个译名吧。JavaFx中任意一个窗口都可以表示为上面的数据结构,在任意给定时间,一个Stage都可以有一个Scene附加到它。

JavaFx中场景图中的所有元素都是Node对象。Node有三种类型: 跟、分支、叶。根结点时唯一没有父结点的结点,看到这里有同学可能会问,Scene不是Node的父结点吗?从数据结构上看是,但是Scene本身并不是Node对象,我们可以将Scene理解为大地。分支结点和叶子结点的区别在于叶子结点没有子结点。在场景图中,父结点的许多属性由子结点共享,

变换-Transformations

在JavaFx中变换分为三种: 平移、缩放、旋转。我们将以下面的例子来演示这三种变换:

public class TransformApp extends Application {
    private Parent createContent(){
        // 矩形设置长宽高
        Rectangle box = new Rectangle(100,50, Color.BLUE);
        transform(box);
        return new Pane(box);
    }
    private void transform(Rectangle box) {
     // 在这里写变换的代码,下面只展示这个方法
    }
    @Override
    public void start(Stage primaryStage) throws Exception {
        primaryStage.setScene(new Scene(createContent(),300,300,Color.GRAY));
        primaryStage.show();
    }
    public static void main(String[] args) {
        launch(args);
    }
}

在windows 上运行此程序出来的效果图如下:

微信图片_20221010152422.jpg

Translate  移动

在JavaFx中,结点可以有三维变换(X、Y或Z)和二维变换(X、Y),但是我们的示例应用程序是2D的,所以我们将只考虑X和Y轴。在JavaFx和计算机图形学中,translate表示移动。下面的程序将上面的矩形在X轴上平移100像素,在Y轴上平移200像素。

微信图片_20221010152425.jpg

代码如下:

private void transform(Rectangle box) {
 // 在这里写变换的代码,下面只展示这个方法
    box.setTranslateX(100);
    box.setTranslateY(200);
}

Scale 缩放

我们可以使用缩放来使得结点变大或者变小,默认情况下,结点在每个轴上的缩放值为1。我们将上面的矩形缩放1.5倍:

private void transform(Rectangle box) {
 // 在这里写变换的代码,下面只展示这个方法
    box.setScaleX(1.5);
    box.setScaleY(1.5);
}

效果图:

微信图片_20221010152537.jpg

Rotate 旋转

代码:

private void transform(Rectangle box) {
   // 先平移再旋转,比较明显 
   box.setTranslateX(100);
   box.setTranslateY(200);
    // 旋转30度
   box.setRotate(30);
}

效果:

微信图片_20221010152611.jpg

事件处理 - Event Handling

事件通知,从字面意思理解就行,就是结点上出现了某事件,来通知监听的人。举一个例子,我们登录系统输入完用户名、密码,点击登录就有对应的监听将你输入的信息发送到服务端。事件通常是事件系统的原语。一般来说,一个事件系统有以下三个职责:

  • 触发事件
  • 通知监听该事件的监听方
  • 处理事件

事件通知有javaFx平台自动完成,我们就只考虑触发事件、监听事件以及如何处理他们就好了。

public class EventApp extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {
        // 创造一个按钮
        Button button = new Button("监听点击事件");
        // 监听按钮点击事件,点击按钮输出helloworld
        button.setOnAction(o->{
            System.out.println("hello world");
        });
        // 
        Pane pane = new Pane(button);
        primaryStage.setScene(new Scene(pane,300,200));
        primaryStage.show();
    }
}

微信图片_20221010152642.jpg

键鼠事件是最常见的,每个Node都有封装好的方法来监听处理这些事件。

相关文章
|
7月前
|
弹性计算 运维 自动驾驶
首个云超算国标正式发布!
近日,我国首个云超算国家标准GB/T 45400-2025正式发布,将于今年10月实施。该标准由阿里云联合多家机构起草,为云超算在高性能计算领域的应用提供规范。云超算结合传统HPC与云计算优势,解决传统HPC复杂、昂贵等问题。阿里云E-HPC V2.0是国内首批通过该标准认证的产品,支持大规模弹性计算,显著降低成本。新标准将推动算力基础设施迈向标准化、智能化新时代。
|
7月前
|
人工智能 光互联 数据中心
横跨半世纪的光通讯巅峰盛会OFC落幕,阿里云在全球光通信顶会OFC2025上发表多个创新成果和报告
​2025年3月,全球光通讯领域最具标杆意义的年度盛会——OFC(光纤通信学术会议暨展览会)迎来其50周年里程碑,在美国加州旧金山盛大开幕。来自全球83个国家和地区,约17000名专家、学者、企业和政府人员齐聚美国,共同融入这场知识与思想的盛会。
|
7月前
|
编解码 边缘计算 文字识别
SmolVLM:资源受限环境下的高效多模态模型研究
SmolVLM是一系列专为资源受限设备多模态模型,通过优化架构与训练策略,在图像和视频处理任务中表现出接近大型模型的性能。该系列包含三种变体:SmolVLM-256M、500M和2.2B,分别适用于极端边缘计算、中等资源设备及高端边缘系统。研究探索了视觉与语言组件间的参数分配、高效视觉信息传递机制、视频编码策略等关键技术,并在多个基准测试中展现出卓越性能。SmolVLM不仅在计算效率和内存占用上具有显著优势,还在设备端部署中表现出高吞吐量和广泛适用性,适用于智能手机、笔记本电脑以及专业领域如文档理解与生物医学视觉问答等场景。论文由Ritvik Rastogi发布,详细探讨了模型设计与实验结果。
292 3
SmolVLM:资源受限环境下的高效多模态模型研究
|
7月前
|
存储 弹性计算 人工智能
阿里云服务器ECS g8i实例怎么样?新一代g8i实例技术特性与场景应用解析
阿里云服务器ECS g8i实例怎么样?对于很多企业用户说,云服务器的性能、安全性和AI能力是用户非常关注的。无论是处理大规模数据、运行复杂算法,还是保障业务应用的安全,都需要云服务器具备卓越的性能和强大的功能。阿里云推出的第八代云服务器ECS g8i实例,凭借其卓越的性能、增强的AI能力和全面的安全防护,成为了市场关注的焦点。本文将为大家解析ECS g8i实例的技术特性、产品优势、适用场景及与同类产品的对比,同时介绍其收费标准和活动价格,以供大家了解和选择。
阿里云服务器ECS g8i实例怎么样?新一代g8i实例技术特性与场景应用解析
|
XML IDE Java
JavaFX 教程
JavaFX 教程
985 1
|
Java XML Maven
跨越时代的飞跃:Struts 2 升级秘籍——从旧版本无缝迁移到最新版,焕发应用新生!
【8月更文挑战第31天】随着软件技术的发展,Struts 2 框架也在不断更新。本文通过具体案例指导开发者如何从旧版平滑升级到 Struts 2.6.x。首先更新 `pom.xml` 中的依赖版本,并执行 `mvn clean install`。接着检查 `struts.xml` 配置,确保符合新版本要求,调整包扫描器等设置。审查 Action 类及其注解,检查配置文件中的弃用项及插件。更新自定义拦截器实现,并验证日志配置。最后,通过一系列测试确保升级后的系统正常运行。通过这些步骤,可以顺利完成 Struts 2 的版本升级,提升应用的安全性和性能。
1988 0
|
存储 机器学习/深度学习 并行计算
Pytorch NCHW/NHWC 的理解
Pytorch NCHW/NHWC 的理解
708 1
|
JSON JavaScript Java
SpringBoot读取配置优先级顺序是什么?
Spring Boot的外部配置加载优先级是开发者理解和管理应用程序配置的关键。它支持多种配置源,包括Java属性文件、YAML文件、环境变量、命令行参数等。配置加载顺序从低到高为:默认属性、@PropertySource加载的配置、Config Data(内部配置文件、外部配置文件)、环境变量、系统属性、Servlet容器初始化参数、SPRING_APPLICATION_JSON格式的环境变量或系统属性以及命令行参数。了解这一顺序有助于在不同环境中灵活配置和管理Spring Boot应用,确保其按预期运行。
453 0
|
前端开发 JavaScript Java
JavaFX学习笔记(三) 架构与图形系统
JavaFX学习笔记(三) 架构与图形系统
|
前端开发 开发者 容器
【Web 前端】相对定位,绝对定位,固定定位的区别?
【4月更文挑战第22天】【Web 前端】相对定位,绝对定位,固定定位的区别?
下一篇
开通oss服务