Java: JavaFX桌面GUI开发

简介: Java: JavaFX桌面GUI开发

1、基本概念

窗口          Stage
  -场景       Scene
    -布局     stackPane
      -控件   Button

2、最小框架代码

创建命令行应用

package com.company;


import javafx.application.Application;
import javafx.stage.Stage;


public class HelloWorld extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
primaryStage.show();
}

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

对就是啥都没有,空白的窗体

d22.3.png


3、控件布局

package com.company;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;


public class Main extends Application {

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

@Override
public void start(Stage primaryStage) throws Exception {
// 实例化按钮
Button button = new Button("这是按钮上的文字");

// 创建布局控件
StackPane stackPane = new StackPane();

// 将button添加到布局
stackPane.getChildren().add(button);

// 创建场景 宽=400 高=400
Scene scene = new Scene(stackPane, 400, 400);

// 将场景添加到窗口
primaryStage.setScene(scene);

// 显示窗口
primaryStage.show();
}
}

d22.4.png


4、事件添加

Main.java


package com.company;

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;


public class Main extends Application implements EventHandler<MouseEvent> {
private Button button;

public static void main(String[] args) {
// write your code here
// System.out.println("你好");
launch(args);
}

@Override
public void start(Stage primaryStage) throws Exception {
// 实例化按钮
button = new Button("这是按钮");

// 1、添加按钮点击事件, this.handle 处理事件
// button.setOnMouseClicked(this);

// 2、使用单独实现的类 事件监听
// button.setOnMouseClicked(new MyMouseEvent());

// 3、使用匿名类添加事件监听
button.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
System.out.println("鼠标点击按钮了");
}
});

// 4、jdk 8 使用简写执行一条输出
button.setOnMouseClicked(e -> System.out.println("简写的监听事件"));

// 5、同时输出多条
button.setOnMouseClicked(e -> {
System.out.println("简写的监听事件1");
System.out.println("简写的监听事件2");
});

// 创建布局控件
StackPane stackPane = new StackPane();

// 将button添加到布局
stackPane.getChildren().add(button);

// 创建场景
Scene scene = new Scene(stackPane, 400, 400);

// 给场景添加事件处理的对象
// scene.setOnMousePressed(this);
scene.setOnMousePressed(new MySceneMouseEvent());

// 将场景添加到窗口
primaryStage.setScene(scene);

// 显示窗口
primaryStage.show();
}

@Override
public void handle(MouseEvent event) {

// event.getSource() 获取事件对象
if (event.getSource() == button) {
System.out.println("点击了按钮");
} else {
System.out.println("点击了场景");
}
}
}

MyMouseEvent.java 处理鼠标点击事件的类

package com.company;

import javafx.event.EventHandler;
import javafx.scene.input.MouseEvent;

public class MyMouseEvent implements EventHandler<MouseEvent> {
@Override
public void handle(MouseEvent event) {
System.out.println("MyMouseEvent click");
}
}

MySceneMouseEvent.java 处理场景点击事件的类

package com.company;

import javafx.event.EventHandler;
import javafx.scene.input.MouseEvent;

public class MySceneMouseEvent implements EventHandler<MouseEvent> {
@Override
public void handle(MouseEvent event) {
System.out.println("场景鼠标点击");
}
}

5、场景切换

package com.company;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;


public class SceneChange extends Application {
Scene scene1, scene2;

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

@Override
public void start(Stage primaryStage) throws Exception {
// 场景1
Button button1 = new Button("场景1 的button");

// 事件监听 点击后切换到场景2
button1.setOnMouseClicked(e -> {
primaryStage.setScene(scene2);
});

VBox vBox = new VBox();
vBox.getChildren().add(button1);
scene1 = new Scene(vBox, 400, 400);

// 场景2
Button button2 = new Button("场景2 的button");

// 事件监听 点击后切换到场景1
button2.setOnMouseClicked(e -> {
primaryStage.setScene(scene1);
});

StackPane stackPane = new StackPane();
stackPane.getChildren().add(button2);
scene2 = new Scene(stackPane, 400, 400);

primaryStage.setScene(scene1);
primaryStage.show();
}
}

d22.5.png


d22.6.png


6、窗体切换

Main.java

package com.company;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;


public class Main extends Application {
private Stage stage;

@Override
public void start(Stage primaryStage) throws Exception {
stage = primaryStage;

// 窗口点击叉号关闭询问
stage.setOnCloseRequest(event -> {
event.consume(); // 消除默认事件
handleClose();
});

// 布局
Button button = new Button("关闭窗口");

// 鼠标点击关闭窗口
button.setOnMouseClicked(event -> handleClose());

VBox vBox = new VBox();
vBox.getChildren().add(button);
Scene scene = new Scene(vBox, 400, 400);

stage.setScene(scene);
stage.show();
}

public void handleClose() {
// 接收窗体返回值
boolean ret = WindowAlert.display("关闭窗口", "是否关闭窗口?");
System.out.println(ret);
if (ret) {
stage.close();
}

}

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

WindowAlert.java

package com.company;

import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Modality;
import javafx.stage.Stage;


public class WindowAlert {
public static boolean answer;

/**
* @param title 标题
* @param msg 消息
*/
public static boolean display(String title, String msg) {
// 创建舞台
Stage stage = new Stage();

// 设置显示模式
stage.initModality(Modality.APPLICATION_MODAL);
stage.setTitle(title);

// 创建控件
Button buttonYes = new Button("是");
buttonYes.setOnMouseClicked(event -> {
answer = true;
stage.close();
});

Button buttonNo = new Button("否");
buttonNo.setOnMouseClicked(event -> {
answer = false;
stage.close();
});

Label label = new Label(msg);

// 创建布局
VBox vBox = new VBox();
vBox.getChildren().addAll(label, buttonYes, buttonNo);
vBox.setAlignment(Pos.CENTER); // 布局居中显示

// 创建场景
Scene scene = new Scene(vBox, 200, 200);

// 显示舞台
stage.setScene(scene);
// stage.show();
stage.showAndWait(); // 等待窗体关闭才继续

// 窗体返回值
return answer;
}
}

d22.7.png

            </div>
目录
相关文章
|
安全 Linux 网络安全
Vivado 2017.04版本安装教程
Vivado 2017.04版本安装教程
1452 0
|
11月前
|
机器学习/深度学习 人工智能 自然语言处理
深度解析Recraft V3:突破文本渲染限制,文生图黑马是怎样炼成的?
Recraft V3模型在文本生成图像(Text-to-Image)领域取得重大突破,通过创新的&quot;Bridging Text Spotting&quot;方法,解决了传统方法中误差累积和性能不佳的问题。该模型采用独立训练的检测器和识别器,并引入Bridge和Adapter机制,确保高质量图像生成。Recraft V3在多个数据集上表现优异,如Total-Text准确率达83.3%,ICDAR 2015达89.5%。其应用前景广泛,涵盖广告设计、教育和娱乐等领域,为文生图技术的实际应用提供了新可能。
512 27
|
安全 测试技术 API
如何实现API接口的自动化测试?
实现API接口的自动化测试涉及多个关键步骤:确定测试范围和目标、编写测试用例、选择自动化测试工具、搭建测试环境、编写测试脚本、执行测试、分析结果和回归测试。选择合适的工具和考虑团队熟悉度是成功的关键。常用工具包括Postman、JMeter和SoapUI。通过这些步骤和工具,可以有效提高测试效率和质量,确保API的稳定性和可靠性。
|
数据采集 人工智能 自然语言处理
Llama 3.1发布:4050亿参数模型,迄今为止最强的开源大模型之一
Meta宣布发布Llama 3.1 405B,这一目前公开的最大且最先进的语言模型,标志着开源语言模型新时代的到来。Llama 3.1 405B不仅在常识理解、数学、工具使用及多语言翻译等功能上媲美顶尖AI模型,其8B和70B版本亦支持多种语言,拥有长达128K的上下文理解能力。该模型在150多个多语言基准测试中表现出色,并经过广泛的人工评估。为克服大规模训练挑战,Meta采用标准解码器架构和迭代后训练策略,大幅提升了数据质量和模型性能。此外,Llama 3.1通过监督微调、拒绝采样和直接偏好优化等手段提高了模型对指令的响应性和安全性。
426 2
|
网络协议 Linux iOS开发
8-18|如何查看本地端口
8-18|如何查看本地端口
|
机器学习/深度学习 存储 人工智能
量子计算与人工智能:探索两大前沿技术的结合
当谈到两个最令人兴奋的领域时,量子计算和人工智能都毫无疑问地处于前沿。这两个领域的结合潜力巨大,为解决一些传统计算难题和推动智能系统的发展带来了新的可能性。本文将探讨量子计算与人工智能的结合,并提供一个简单的代码案例来演示这种融合的潜力。
746 0
|
机器学习/深度学习 人工智能 自然语言处理
揭秘未来:量子计算与人工智能的融合之路
本文旨在探讨量子计算和人工智能(AI)的结合前景及其对科技领域的潜在影响。通过分析当前技术发展态势,揭示两者融合所带来的创新机遇与挑战,并预测其对未来社会变革的可能贡献。文章将深入剖析量子计算在解决复杂问题方面的优势,以及AI在模式识别和数据分析方面的专长,进而展望两者结合在未来技术革新中的关键作用。
|
存储 人工智能 缓存
程序员应该学习的 10 件事(完整版)
程序员应该学习的 10 件事(完整版)
266 2
|
存储 大数据 数据管理
元宇宙与大数据之间存在着紧密的联系,以下是关于它们之间关系的详细阐述:
**元宇宙是融合扩展现实、数字孪生和区块链的虚实融合新形态,特征包括同步拟真、开源创造、永续及闭环经济。大数据则指海量复杂数据集,以其大容量、多样性、高速处理和低价值密度为特点。元宇宙依赖大数据进行用户行为分析、智能决策和经济体系管理,而大数据在元宇宙中找到广泛应用场景,两者相互促进发展。**
|
机器学习/深度学习 人工智能 算法
探索人工智能在图像识别领域的创新应用
【5月更文挑战第30天】 随着深度学习技术的飞速发展,人工智能(AI)在图像识别领域取得了革命性的进展。本文旨在探讨AI技术如何优化图像识别流程,提高识别精度,并分析其在多个行业中的实际应用。通过对比传统方法和最新的研究成果,我们展示了AI驱动的图像识别系统在处理速度、准确率和自动化水平方面的显著提升。此外,文章还将讨论当前面临的挑战和未来的发展趋势,为读者提供一个关于AI在图像识别领域内应用的全面视角。