JavaFX 学习笔记——窗口与控件

前言

如今比较流行的桌面gui框架有WPF、WinForm、Qt、javafx等。其中WPF和WinForm目前还只能在运行Winsows上。Qt(widget)是一个很强大的跨平台C++框架(不只是UI),但用C++写界面实在有点蛋疼,且编译出来的体积很大。

JavaFX是基于JAVA的开源桌面框架,笔者曾学习过Qt,打算尝试使用Java写桌面应用,现在网上关于JavaFX的教程不时很多,因此在这里记录一下学习过程。

安装和配置

JavaFX11的环境不包括在JDK中,因此要在配置好JDK11的基础上单独配置,具体方法可以参考JavaFX官网。

窗口构成

新建工程,在Main.java中输入下列代码:

public class Main extends Application {@Overridepublic void start(Stage primaryStage) throws Exception{VBox layout = new VBox();Label label = new Label("Hello world");layout.getChildren().add(label);Scene scene = new Scene(layout, 300, 300);primaryStage.setTitle("Hello World");primaryStage.setScene(scene);primaryStage.show();}public static void main(String[] args) {launch(args);}
}

JavaFX中的Stage可以看作是窗口,Scene是窗口中的内容,调用StagesetScene函数来设置窗口内容,窗口可以在运行时切换显示的Scene,实现Tab页面的效果。

VBox是JavaFX中的一种布局,其中的元素纵向排列,向VBox中添加元素需要调用vbox.getChildren().add(control),如上所示。

构造Scene时传入顶层的布局(类似Qt中QMainWindowCentralWidget)及大小。最后调用show函数将窗口显示出来。

按钮控件

控件(Control)是GUI框架中最重要的部分,也是用户与程序进行交互的媒介。

在JavaFX中使用控件需要导入包,例如

import javafx.scene.control.Label;
import javafx.scene.control.*;

框架中不同控件的使用方法大同小异,这里用最常用的按钮作为示例。

在窗口中添加按钮

构造一个Button对象并添加到VBox中:

Button button = new Button("Click me");
VBox layout = new VBox();
layout.getChildren().add(button);Scene scene = new Scene(layout, 300, 300);
primaryStage.setScene(scene);

处理按钮点击事件

使用EventHandler接口

创建Handler类实现EventHandler接口

class Handler implements EventHandler<ActionEvent> {@Overridepublic void handle(ActionEvent actionEvent) {if(actionEvent.getSource() instanceof Button)((Button) actionEvent.getSource()).setText("Click me again");}
}

为按钮注册点击方法

button.setOnAction(new Handler());

Button还有setOnMouseClicked,setOnTouchPressed等方法,这些是专门为处理鼠标事件及触摸事件,setOnAction函数用来处理按钮触发事件(不管按钮被哪种方式触发,具体参考文档)。

由代码可以得出,setOnAction函数接收一个EventHandler接口,接口的handle方法用来处理事件。

使用匿名内部类

与上一方法同理,我们可以使用匿名内部类创建接口

button.setOnAction(new EventHandler<ActionEvent>() {@Overridepublic void handle(ActionEvent actionEvent) {if(actionEvent.getSource() instanceof Button)((Button) actionEvent.getSource()).setText("Click me again");}
});

使用Lambda表达式

Java中的一些接口可以由lambda表达式代替,因此可以在setOnAction中传入lambda表达式:

button.setOnAction(actionEvent -> {if(actionEvent.getSource() instanceof Button){((Button) actionEvent.getSource()).setText("Click me again");}
});

这样就可以在实现简单的事件处理器时不必再特意实现接口。

其他控件

使用其他控件的方法也都类似按钮,使用时可以查询文档,或者根据IDE的代码提示获知函数签名及使用方法。

多窗口

在一个桌面程序中往往有多个窗口,下面介绍添加窗口的方法。

创建窗口

添加MsgBox

public class MsgBox {public static void show(String title) {Stage window = new Stage();window.setTitle(title);Button trueButton = new Button("True");Button falseButton = new Button("False");HBox hBox = new HBox(10);    //10为元素间空隙hBox.getChildren().addAll(trueButton, falseButton);Scene scene = new Scene(hBox, 100, 100);window.setScene(scene);window.show();}
}

与主窗口创建过程相同,新建stageScene、布局及控件,最后使用Stageshow方法显示出来。

调用MsgBox类的show方法即可显示窗口,函数的参数为窗口的标题。

设置主窗口中的按钮事件,点击按钮后会显示一个MsgBox窗口。

button.setOnAction(actionEvent -> MsgBox.show("SubWindow"));

窗口模态

Stage对象可以使用initModality方法设置窗口模态类型

window.initModality(Modality.WINDOW_MODAL);

类型包括 Modality.NONE, Modality.WINDOW_MODAL, Modality.APPLICATION_MODAL

  • Modality.NONE: 不阻塞任何窗口
  • Modality.WINDOW_MODAL: 窗口级别的模态,仅仅阻塞与对话框关联的窗口,用户可以正常访问其他窗口,适合用于多窗口的程序。
  • Modality.APPLICATION_MODAL(默认值): 应用程序级别的模态,窗口将阻塞整个程序,无法访问程序中其他的窗口

返回子窗口的值

有时我们需要得到用户在子窗口中的操作,例如在本文的例子中,获知用户点了哪一个按钮。

接下来实现这样的功能——点击True按钮就在控制台打印true,否则打印'false'。

更改MsgBox中的代码

public static boolean show(String title) {Stage window = new Stage();window.setTitle(title);Button trueButton = new Button("True");Button falseButton = new Button("False");trueButton.setOnAction(actionEvent -> {answer = true;window.close();});falseButton.setOnAction(actionEvent -> {answer = false;window.close();});HBox hBox = new HBox(10);hBox.getChildren().addAll(trueButton, falseButton);Scene scene = new Scene(hBox, 100, 100);window.setScene(scene);window.showAndWait();return answer;
}

show函数返回一个boolean类型的值,这个值是由点击的按钮决定的,按钮点击后会关闭窗口,返回布尔值。

设置主窗口中按钮点击事件

button.setOnAction(actionEvent ->
{var result = MsgBox.show("SubWindow");System.out.println(result);
});

showAndWait函数

这个函数会阻塞当前事件,直到窗口被关闭后才会返回,并执行接下类的语句。在上例中,我们显示窗口并等待,直到点击按钮使窗口被关闭,才执行后面的return answer语句。

可以尝试改为调用show方法,观察返回的结果。

窗口的关闭

有时在用户关闭窗口时,需要执行一定的操作,例如保存设置、确认是否退出等。

这时我们可以通过setOnCloseRequest函数设置窗口关闭时触发的事件

window.setOnCloseRequest(windowEvent ->
{System.out.println("The window will be closed!");
});

JavaFX在关闭窗口时,首先执行这一事件处理函数,再将窗口关闭。但在某些情况下(例如确认是否关闭),我们需要在处理事件时取消窗口的关闭,这种情况下可以调用windowEventconsume方法,告诉事件系统,此事件已经被处理完毕,不必再执行其他处理动作(如关闭窗口)。

将主窗口的代码改为:

@Override
public void start(Stage primaryStage) throws Exception {Button button = new Button("Click me");button.setOnAction(actionEvent ->{var result = MsgBox.show("SubWindow");System.out.println(result);});VBox layout = new VBox();layout.getChildren().add(button);Scene scene = new Scene(layout, 300, 300);primaryStage.setScene(scene);primaryStage.setTitle("Hello World");primaryStage.setOnCloseRequest(windowEvent -> {var result = MsgBox.show("Do you want to CLOSE?");if (result == false) {windowEvent.consume();}});primaryStage.show();
}

当用户点击关闭按钮时,将会弹窗询问是否关闭,若用户点击False按钮窗口就不会被关闭。

链接

  1. 推荐一个很好的JavaFX教程视频:https://youtu.be/FLkOX4Eez6o
  2. 一个适合初学者的Qt教程:https://www.devbean.net/2012/...

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

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

相关文章

Linux 用户名、主机添加背景色

文章参考&#xff1a;PS1应用之——修改linux终端命令行各字体颜色 Linux 用户名、主机添加背景色&#xff0c;用于生产环境&#xff0c;这样可以减少人为的误操作。 1 [rootzhang ~]# tail /etc/bashrc 2 ……………… 3 export PS1"\[\e[37;40m\][\[\e[37;41m\]\u\[\e[3…

python 调用文件上传图片简单例子

使用方法&#xff1a; python.exe .\test.py "fileD:\img\mark_1080.png" "matchWordListRUN" "urlhttp://192.168.0.37:8081/templateMatch" test.py import requests import sysif __name__ "__main__":print(参数个数为:, len(s…

如何从手机或PC将游戏下载到PlayStation 4

PlayStation 4 games can be huge, and take hours to download. Thankfully, you can start downloading games even when you’re away from home. All you need is Sony’s official smartphone app, or a web browser on any PC. PlayStation 4游戏可能非常庞大&#xff0c…

kaggle入门项目:Titanic存亡预测(三)数据可视化与统计分析

---恢复内容开始--- 原kaggle比赛地址&#xff1a;https://www.kaggle.com/c/titanic 原kernel地址&#xff1a;A Data Science Framework: To Achieve 99% Accuracy Step 4: Perform Exploratory Analysis with Statistics 使用描述性与图表分析数据&#xff0c;重点在于数据可…

docker遇到问题归纳

/bin/sh^M: bad interpreter #在win下编辑的时候&#xff0c;换行结尾是\n\r &#xff0c; 而在linux下 是\n&#xff0c;所以才会有 多出来的\r #可以用以下方式解决先在控制台cd到报错的目录#编辑报错的那个文件 vi xxx.sh#利用如下命令查看文件格式 :set ff 或 :set filef…

firefox 扩展_如何检查您的扩展程序是否将停止与Firefox 57一起使用

firefox 扩展With Firefox 57, scheduled for release in November 14, 2017, Mozilla will end support for legacy extensions, and only support newer WebExtensions. Here’s how to check if your extensions will stop working—and how to keep using them after Novem…

边缘服务网格 osm-edge

本文篇幅稍长&#xff0c;阅读本文将了解以下内容&#xff1a;•什么是 osm-edge 及其产生背景•边缘计算与中心云计算的差异&#xff0c;以及带来的挑战•osm-edge 的设计及采用的技术•5 分钟快速体验边缘服务网格关于 osm-edgeosm-edge 是针对边缘计算环境设计的服务网格&am…

powershell获取exe文件返回值

一、目的 1.powershell能简单写一些小脚本&#xff0c;不需要exe开发这么笨重。 2.在windows实现某个特定功能&#xff0c;做成一个exe能方便查看管理。 二、实现 1.C# code 运行结束加入返回值 Environment.ExitCode 1; //自定义数字 2.powershell 调用并获取 需要增加…

活水亭观书有感其一_如何将iPad置于“信息亭”模式,将其限制为单个应用程序...

活水亭观书有感其一An iPad makes a great “kiosk” device–a tablet restricted to one specific app for your home or small business. You can create a makeshift kiosk using the Guided Access feature, or enable Single App Mode for a true kiosk environment. iPa…

powershell 特殊符号处理

显示字符串有双引号 “ 两个双引号产生一个双引号&#xff0c;这里不包括最外层的双引号。 $a"PowerShell" """My name is $a"",this program said." 使用转义字符 转义序列由反引号定义&#xff0c;也就是键盘F1下面与波浪线同键…

IDEA 学习笔记之 安装和基本配置

安装和基本配置&#xff1a; 下载&#xff1a;https://www.jetbrains.com/idea/download/#sectionwindows 下载Zip安装包&#xff1a; 基础知识&#xff1a; Eclipse的工作区IDEA的项目 Eclipse的项目IDEA的模块 修改信息提示&#xff1a;Alt/ 关闭当前窗口&#xff1a;CtrlW 自…

大厂高级前端面试题答案

阿里 使用过的koa2中间件https://www.jianshu.com/p/c1e... koa-body原理https://blog.csdn.net/sinat_1... 有没有涉及到Clusterhttp://nodejs.cn/api/cluster.... 介绍pm2PM2是node进程管理工具&#xff0c;可以利用它来简化很多node应用管理的繁琐任务&#xff0c;如性能监控…

js app缓存自动刷新_如何通过清除缓存来刷新App Store中的内容

js app缓存自动刷新Are you finding that you’re not seeing new apps on the App Store, or that updates to apps won’t go away even after you’ve installed the updates? Here’s a simple fix. 您是否发现自己在App Store上没有看到新的应用程序&#xff0c;或者即使…

用最少的代码,写一个智能会议APP(MAUI)

Xamarin和MAUI移动开发是.NET核心方向之一&#xff0c;国外社区资源非常丰富&#xff0c;影响力挺大的。而国内则资源很是欠缺&#xff0c;GitHub上的国产开源案例太少了。随着小米/美的/碧桂园等WPF招聘大户开始要求移动开发&#xff0c;不少群友都在找相关资源。这里分享一套…

word多级列表修改编号_如何更改在Word中的编号列表中使用的数字类型

word多级列表修改编号By default, Word uses Arabic numbers (1, 2, 3, etc.) when you create numbered lists. However, you can change the numbers to a different type or to letters. The character after the number or letter can also be changed. 默认情况下&#xf…

微服务学习笔记

微服务是一种架构模式或者说是一种架构风格&#xff0c;他提倡将单一的应用程序划分为一组小的服务&#xff0c;每个服务运行在其独立的进程中&#xff0c;服务之间互相协调&#xff0c;互相配合&#xff0c;为用户提供最终价值。dubbo与spring Cloud之间的区别之一是dubbo基于…

每小时50哈希——看看一个内部员工是如何摧毁整个公司网络的?

本文讲的是每小时50哈希——看看一个内部员工是如何摧毁整个公司网络的&#xff1f;&#xff0c;我们以前曾调查过黑客会通过连接在USB端口的正在充电的手机实施攻击&#xff0c;在这项研究中&#xff0c;我们重新审视了USB端口的安全性。我们发现&#xff0c;手机充电时&#…

推荐一款 在线+离线数据 同步框架 Dotmim.Sync

移动智能应用可以分为在线模式、纯离线模式与“在线离线”混合模式。在线模式下系统数据一般存储在服务器端的大中型数据库&#xff08;如 SQL Server、Oracle、MySQL 等&#xff09;&#xff0c;移动应用依赖于稳定可靠的网络连接&#xff1b;纯离线模式下系统数据一般存储在移…

如何在Windows 10中将您喜欢的设置固定到开始菜单

If you find you’re accessing the same settings over and over in Windows 10, you can add these settings to the Start menu as tiles for quick and easy access. We’ll show you how to do this. 如果发现要在Windows 10中反复访问相同的设置&#xff0c;则可以将这些…

20155202《网络对抗》Exp9 web安全基础实践

20155202《网络对抗》Exp9 web安全基础实践 实验前回答问题 &#xff08;1&#xff09;SQL注入攻击原理&#xff0c;如何防御 SQL注入产生的原因&#xff0c;和栈溢出、XSS等很多其他的攻击方法类似&#xff0c;就是未经检查或者未经充分检查的用户输入数据&#xff0c;意外变成…