JavaFX 基础

news2024/12/23 21:13:11

1.JavaFX应用的程序基本结构

窗口(stage):窗口里面可以设置场景,但是一次只能显示一个场景。

场景(scene):场景可以添加UI组件图的树形结构。

根节点(parent):根节点设置为一个布局,放置不同的节点(组件)。可以在根节点嵌套放置根节点。

生成与上图匹配的场景图的一种可能的实现如下。


public class HelloApp extends Application {

    private Parent createContent() {
        return new StackPane(new Text("Hello World"));
    }

    @Override
    public void start(Stage stage) throws Exception {
        stage.setScene(new Scene(createContent(), 300, 300));
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

2、JavaFX应用的Application

执行顺序是 init() -> start() -> stop()

package sample;

import javafx.application.Application;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.text.Text;
import javafx.stage.Stage;

public class JavaFX1 extends Application {

    private Parent createContent() {
        return new StackPane(new Text("Hello World"));
    }
    //init方法执行后执行start方法
    @Override
    public void start(Stage stage) throws Exception {
        stage.setScene(new Scene(createContent(), 300, 300));
        stage.show();
    }

    @Override
    public void init() throws Exception {
        //程序启动,最先执行
        super.init();
    }

    @Override
    public void stop() throws Exception {
        //程序关闭,最后执行
        super.stop();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

 3、JavaFX应用的Stage

设置标题

//设置标题
stage.setTitle("hello");

设置图标

stage.getIcons().add(new Image("image/icon.png"));

窗口大小控制

//窗口大小控制:true大小可调,false不可调
stage.setResizable(true);

initStyle设置窗口样式,StageStyle窗口样式

stage.initStyle(StageStyle.DECORATED);  //默认样式

x,y,width,heigth坐标,宽,高

//设置位置
button1.setLayoutX(200);
button1.setLayoutY(200);
//设置宽高
stage.setWidth(400);
stage.setHeight(400);       

Modality窗口是否是模态的

stage1.initModality(Modality.APPLICATION_MODAL);  //应用模态(全局模态:点开一个子窗口只可在当前窗口操作)
//stage1.initModality(Modality.NONE);  //非模态(默认为非模态)
取消或重写操作系统默认退出事件
        //1.取消操作系统默认退出事件
        Platform.setImplicitExit(false);
        stage.setOnCloseRequest(event -> {
            //2.取消右上角的x关闭窗口事件
            event.consume();
            //3.创建一个弹窗
            Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
            alert.setTitle("退出");
            alert.setHeaderText(null);
            alert.setContentText("确认要退出!");
            Optional<ButtonType> result = alert.showAndWait();
            if (result.get() == ButtonType.OK) {
                //退出程序
                Platform.exit();
                //关闭窗口,不退出程序
                stage.close();
            }
        });

4、JavaFX应用的Scene

1、场景切换

public class JavaFx2 extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {
        //1编写第一个场景
        Button btn1 = new Button("第一个场景");
        btn1.setLayoutX(200);
        btn1.setLayoutY(200);
        AnchorPane anchorPane1 = new AnchorPane();
        anchorPane1.getChildren().add(btn1);
        Scene scene1 = new Scene(anchorPane1);

        //2编写第二个场景
        Button btn2 = new Button("第二个场景");
        btn2.setLayoutX(200);
        btn2.setLayoutY(200);
        AnchorPane anchorPane2 = new AnchorPane();
        anchorPane2.getChildren().add(btn2);
        Scene scene2 = new Scene(anchorPane2);

        //3.点击按钮,切换场景
        btn1.setOnAction(e -> {
            primaryStage.setScene(scene2);
        });

        btn2.setOnAction(e -> {
            primaryStage.setScene(scene1);
        });

        primaryStage.setScene(scene1);
        primaryStage.setWidth(400);
        primaryStage.setHeight(400);
        primaryStage.setTitle("场景切换");
        primaryStage.show();


    }
}

5、Node UI控件的通用属性


Node类是一个抽象类,所有控件的父类都是Node。以下简单介绍下常用的方法:

◆ layoutX / layoutY / preWidth / preHeight

◆ style / visible / opacity / blendMode

◆ tanslateX / tanslateY / rotate / scaleX / scaleY /scaleZ

 6、UI控件的属性绑定和属性监听

public class JavaFx3 extends Application {
    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("属性监听示例");

        //设置滑块
        Slider slider = new Slider();
        slider.setMin(0);
        slider.setMax(100);
        slider.setValue(50);
        slider.setOrientation(Orientation.HORIZONTAL);

        Label label = new Label();
        label.setText("滑块值: " + slider.getValue());

        //监听滑块值变化
        slider.valueProperty().addListener(new ChangeListener<Number>() {
            @Override
            public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
                label.setText("滑块值: " + newValue);
            }
        });

        VBox vbox = new VBox(slider, label);
        Scene scene = new Scene(vbox, 200, 100);
        primaryStage.setScene(scene);

        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

监听效果图如下:

 

7、JavaFX应用里的事件驱动编程

1、键盘事件

public class JavaFx4 extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("键盘事件");

        Label label = new Label("你按下的键: ");
        StackPane root = new StackPane(label);

        root.setOnKeyPressed(new EventHandler<KeyEvent>() {
            @Override
            public void handle(KeyEvent event) {
                label.setText("你按下的键: " + event.getCode());
            }
        });

        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();

        // Request focus so keypresses can be handled
        root.requestFocus();
    }
}

在这个例子中,我们使用setOnKeyPressed方法来为Root StackPane添加了一个键盘事件处理程序,只要用户在应用程序窗口中按下任何键,系统就会打印出键的编码。

2.点击事件

public class JavaFx5 extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {
        primaryStage.setTitle("点击事件");

        Label label = new Label("");
        label.setLayoutX(100);
        label.setLayoutY(200);
        Button btn = new Button();
        btn.setLayoutX(150);
        btn.setLayoutY(150);
        btn.setText("点我!");
        btn.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                label.setText("你点击了按钮");
            }
        });

        AnchorPane root = new AnchorPane();
        root.getChildren().add(label);
        root.getChildren().add(btn);
        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();
    }
}

8、FXML布局文件的使用

在学习FXML之前,我们的代码都是直接写在类里面的,比方实现一个点击按钮字体移动的效果,我们以前写的代码如下:

现在用FXML文件管理组件

1、主方法的start方法中加载fxml文件,并放置场景中

2、fxml文件的配置和Controller配置组件属性和事件方法

9、Scene Builder构建 fxml布局文件 

1、首先要下载 Scene Builder | JavaFX中文官方网站

2、Scene Builder的使用

2.1 安装好后,打开程序,先拖拽一个Containers下的AnchorPane进来

2.2 同上,我们可以往布局里面添加组件

 2.3 给组件设定事件,生成controller层代码 

 2.4 ctrl + s 保存到桌面,把fxml复制到idea项目中,写一个Controller,把生成的Controller复制到Controller中

2.5 在fxml中把controller路径配上

10、IDEA支持Scene Builder

在idea的Settings里面搜索javafx,设置安装SceneBuildert的安装路径,然后就可以在fxml文件中右键选择Open In SceneBuildert中直接打开软件,在软件内编辑完后保存,就可以直接更新fxml文件了

若此文档不够详细,可以参考JAVAFX基础入门_哔哩哔哩_bilibili

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

备战秋招 | 笔试强训2

目录 一、选择题 二、编程题 三、选择题题解 四、编程题题解 一、选择题 1、使用printf函数打印一个double类型的数据&#xff0c;要求&#xff1a;输出为10进制&#xff0c;输出左对齐30个字符&#xff0c;4位精度。以下哪个选项是正确的&#xff1f; A. %-30.4e B. %4.…

白皮书案例解读|数字孪生与港口的结合会碰撞出什么样的火花呢?

以下案例来自于《数字孪生世界白皮书&#xff08;2023版&#xff09;》 领取方式&#xff1a;公众号「EasyV数字孪生」后台回复「白皮书」即可领取&#xff01; 嗨&#xff0c;我又出现啦&#xff5e;今天想和大家聊聊关于港口场景数字孪生技术的应用&#xff0c;欢迎大家踊跃…

Linux登录时,下游回显非常慢

目录 问题现象 原因分析 解决方法 源码等资料获取方法 问题现象 登录linux时&#xff0c;远程连接正常&#xff0c;[root...]回显非常慢&#xff0c;在执行脚本时&#xff0c;很容易导致命令下发错乱 原因分析 家目录下的.bash_history文件太大&#xff0c;导致每次登陆时读…

magento2 二次开发如何自定义theme

1.在app\design\frontend下创建自定义Theme文件夹&#xff0c;格式为Vendor/ThemeName&#xff0c;比如TestCompany/test 2.在TestCompany/test目录下创建文件夹和文件如下&#xff1a; etc 非必须创建 在此目录下添加view.xml&#xff0c;内容如下&#xff1a; view.xml可定…

Occupy the Cities - 思维+二分

分析&#xff1a; 分析每一个0的位置&#xff0c;记录每一个0距离两侧的1的最近距离&#xff0c;每一个1要么向左扩展要么向右扩展&#xff0c;可以将扩展过的1标记&#xff0c;如果需要向另一侧扩展&#xff0c;那么必须满足距离另一侧的0的距离加1小于等于时间&#xff0c;比…

网络安全行业的那些岗位

网络安全行业&#xff0c;正在蓬勃发展&#xff0c;想要找网络安全岗位的&#xff0c;可以参考这篇文章 一、网络安全岗位 1、需要网络安全人员的企业 有三种企业招聘网络安全人员&#xff1a;乙方企业、甲方企业、国有企业 乙方企业是专门从事网络安全行业的企业&#xff0c…

用Arthas快速定位线上JVM问题!

Arthas分析FullGC问题定位 对于FullGC那一定不会陌生,一般来说会采用横切FullGC前置拦截(-XX:+HeapDumpBeforeFullGC)和后置拦截(-XX:+HeapDumpAfterFullGC),导出FullGC发生前后的heap dump文件,以便于我们进行FullGC原因的分析和定位。 推测分析问题之FullGC的频率过高…

SpringBoot2+Vue2实战(十八)修改密码

一、修改密码&#xff1a; Header.vue <el-dropdown-item style"font-size: 14px; padding: 5px 0"><router-link to"/password" style"text-decoration: none">修改密码</router-link></el-dropdown-item> router/i…

tensorrt8.5.2安装,并解决CMAKE找不到tensorrt问题

ubuntu20.04、cuda11.1、cudnn8.0.5&#xff08;后续要更新到8.6.0&#xff09; tensorrt下载网址&#xff1a;NVIDIA TensorRT 8.x Download | NVIDIA Developer 选择自己合适的cuda安装 下载的时候可以使用wget wget https://developer.download.nvidia.com/compute/machin…

【springboot】RestTemplate序列化RedisSerializer到底该选哪个

RedisTemplate是Spring Data Redis提供给用户的最高级的抽象客户端&#xff0c;用户可直接通过RedisTemplate对Redis进行多种操作。 在项目中使用需要引入如下依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>…

ScrollRect滚动区域Content列表项数据钳制取值问题

问题 如下图示例&#xff0c;是一个选择日期、时间的日历控件&#xff0c;右侧小时与分钟的部分是两个Scroll Rect滚动区域组件&#xff0c;滚动到中间高亮部分表示选择&#xff0c;那么如何让滚动停止在合适的位置&#xff1f;避免出现如图所示的停在两个数据项中间的情况。 …

Slam十四讲之第一讲和第二讲,实践编程基础

目录 1.镜像寻找①方法1&#xff1a;百度网盘下载②方法2&#xff1a;在开源镜像网站上下载&#xff0c;③方法3&#xff1a;直接在Ubuntu官网下载 2 在VMware中创建虚拟机并安装Ubuntu18.043 安装VMware Tools4 初始系统中&#xff0c;部分软件的安装4.1 gcc 安装4.2 g安装4.3…

Word 插件实现读取excel自动填写

日常工作中碰到需要将EXCEL的对应数据记录填写到word文档对应的位置&#xff0c;人工操作的方式是&#xff1a; 打开exel表—>查找对应报告号的行—>逐列复制excel表列单元格内容到WORD对应的位置&#xff08;如下图标注所示&#xff09; 这种方法耗时且容易出错。实际上…

vcomp140.dll丢失怎样修复?多种方法教你修复

vcomp140.dll丢失算是一个比较常见的异常事件&#xff0c;在使用电脑的时候&#xff0c;有时候弹窗出现由于找不到vcomp140.dll&#xff0c;无法继续执行代码等&#xff0c;这种都是属于vcomp140.dll文件丢失&#xff0c;今天我们主要针对这个情况来给大家说说vcomp140.dll丢失…

自动化测试工具大盘点

本系列文章我们将带大家一起了解一下互联网大厂中通科技的自动化测试平台的搭建历程&#xff0c;从以下四个方面展开介绍&#xff1a;为什么要做这样一个统一的自动化测试平台&#xff1f;是如何做到统一的&#xff1f;平台上线后的收益&#xff0c;最后一部分会给大家分享一下…

CSDN 周赛 62 期

CSDN 周赛 62 期 参赛体验选择题1234编程题1、题目名称:覆盖面积2、题目名称:机器猫参赛体验 这次没有出填空题,好评。 选择题四个,基本上,对数据库比较熟悉的人,应该都可以全部答对的。 编程题两个,嗯。。。。就是上周偷偷摸摸更新出来的四个题目之二。还以为不会出…

levelx norFlash

levelx 文章目录 OverviewQuoteBriefDefinitionTheory 实现原理1.初始化流程2.写操作3.读操作4.回收函数 Overview 实现了flash的均衡摩擦&#xff0c;有针对nor 和 nand的接口 配合azure RTOS 以及xfile比较合适&#xff0c;单独使用不是很友好 Quote https://learn.micro…

C# Sdcb.Paddle2Onnx Paddle模型通过C#转换为ONNX模型

https://github.com/sdcb/PaddleSharp/blob/feature/2.5/docs/paddle2onnx.md 效果 项目 代码 using Sdcb.Paddle2Onnx; using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing…

相对绝对定位父元素不设置宽度,根据子元素撑开(white-space: nowrap;)

要做一个如下的弹窗&#xff0c;很简单。但是当要切换成多语言或者数据是动态的话&#xff08;title可能会很长&#xff09;&#xff0c;那么弹窗固定宽度就不适用了。 有可能会出现下图的情况 也有可能出现下面的情况&#xff0c;文字被换行了&#xff08;有时候这种情况也是…

每日一练 | 华为认证真题练习Day77

1、如下图所示&#xff0c;主机A和主机B使用哪种网络设备可以实现通信&#xff1f; A. 路由器 B. 集线器 C. HUB D. 二层交换机 2、路由器输出信息如下&#xff0c;下列说法错误的是&#xff1f; A. Ethernet0/0/0接口的MTU值为1480 B. Ethernet0/0/0接口物理链路正常 C.…