Java: JavaFX桌面GUI开发
发布日期:2021-07-01 06:06:38
浏览次数:3
分类:技术文章
本文共 7333 字,大约阅读时间需要 24 分钟。
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); }}
对就是啥都没有,空白的窗体
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(); }}
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{ 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 () { @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{ @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{ @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(); }}
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; }}
转载地址:https://pengshiyu.blog.csdn.net/article/details/100186537 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2024年05月01日 08时36分20秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
机器学习:SVM(核函数、高斯核函数RBF)
2019-05-08
机器学习:SVM(scikit-learn 中的 RBF、RBF 中的超参数 γ)
2019-05-08
机器学习:SVM(SVM 思想解决回归问题)
2019-05-08
Hbase学习笔记(一)
2019-05-08
Hbase学习笔记(二)
2019-05-08
Hbase学习笔记(三)
2019-05-08
超实用学习必备搜索技能,教你如何用好搜索引擎!
2019-05-08
Linux学习资源推荐
2019-05-08
数据通信-网络的基础概念
2019-05-08
C++中替代sprintf的std::ostringstream输出流详解
2019-05-08
数据通信-TCP/IP
2019-05-08
数据通信-IP子网划分
2019-05-08
linux-软件包管理及RPM包管理(rmp命令管理)
2019-05-08
linux-rpm命令管理(查询,校验和文件管理)
2019-05-08
linux-RPM包管理-yum在线管理(IP地址配置和网络yum源,yum命令)
2019-05-08
linux-源码包管理
2019-05-08
linux-脚本安装包
2019-05-08
linux-用户和用户组管理-用户配置文件
2019-05-08
linux-用户配置文件-影子文件,组信息文件
2019-05-08
linux-用户管理相关文件
2019-05-08