前言

如今比较流行的桌面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/...

JavaFX 学习笔记——窗口与控件相关推荐

  1. vs2010 学习Silverlight学习笔记(7):控件样式与模板

    概要: 终于知道Silverlight--App.xaml是干什么用的了,不仅可以用来封装样式(类似css),还可以制定控件模版...好强大的功能啊. 封装: 继续学习<一步一步学Silverl ...

  2. vb.net listview 删除选定行_VBA学习笔记59-1: listview控件

    学习资源:<Excel VBA从入门到进阶>第59集 by兰色幻想 本节学习Listview控件,它可以用多种视图方式显示项目的控件.由于其外形美观而且非常实用,所以使用频率很高. Lis ...

  3. kendo treeview 修改节点显示值_VBA学习笔记60-1: Treeview控件

    学习资源:<Excel VBA从入门到进阶>第60集 by兰色幻想 本节讲Treeview控件. TreeView控件是以树形结构显示数据的控件.利用TreeView控件,可以设计出树形结 ...

  4. 【MFC】学习笔记:常用控件之组合框(Combo Box)

    01.目录 目录 01.目录 02.控件介绍 03.控件的消息通知函数 04.创建组合框控件及成员函数介绍 4.1 组合框的创建 4.2 CComboBox类的主要成员函数 05.应用实例 06.总结 ...

  5. Win32 学习笔记_列表控件(ListBox)

    ListBox控件 1. 创建控件 // 创建ListBox控件 HWND hListBox = CreateWindowEx(0, TEXT("ListBox"), NULL, ...

  6. javaFX学习之DatePicker日期控件

    附送我自定义的日期格式化工具类: import java.text.DateFormat; import java.text.ParseException; import java.text.Simp ...

  7. ASP.NET 学习笔记_01 广告控件的使用

    广告控件的使用: 广告文件是一个XML文件,广告文件中所有的标签属性被分析后放到adProperties字典中,用以属性编辑. ads.xml 1 <?xml version="1.0 ...

  8. Qt学习笔记之常用控件QlistWidget

    一.QListWidget Class The QListWidget class provides an item-based list widget. More... Header: #inclu ...

  9. Android开发学习笔记-自定义组合控件

    为了能让代码能够更多的复用,故使用组合控件.下面是我正在写的项目中用到的方法. 1.先写要组合的一些需要的控件,将其封装到一个布局xml布局文件中. <?xml version="1. ...

最新文章

  1. Jquery string 和 json相互转换的方法
  2. pd.merge 结果出现重复_COUNTIFS函数技巧之去重复值计数(思路分析,过程详解)...
  3. 15.selenium_case01
  4. VS中怎样打开MSDN帮助文档
  5. oracle命令行打不开,关于oracle命令行上下左右键没法使用解决办法
  6. 互联网日报 | 6月4日 星期五 | 蚂蚁消费金融获批开业;腾讯云四个国际数据中心同步开服;滴滴App上线“老人打车”模式...
  7. vue学习笔记(五):对于vuex的理解 + 简单实例
  8. Win32汇编——钩子
  9. Xcode10升级问题:Multiple commands produce Info.plist
  10. 拓端tecdat|R语言进行数据结构化转换:Box-Cox变换、“凸规则”变换方法
  11. PHP SPL 迭代器
  12. 树莓派串口的使用(pyserial库)
  13. win10连上wifi却上不了网
  14. 我的 OCM 之路|书写无悔青春,追梦永不止步
  15. 腾讯云服务器8核16G18M配置测评
  16. @Embedded 和 @Embeddable
  17. java memorycache原理_CPU Cache 原理及操作
  18. 《山海经》第一卷(南山经)南山一经
  19. 自己动手写搜索引擎(常搜吧历程三#搜索#)(Java、Lucene、hadoop)
  20. WIN7下开机欢迎界面去掉画面下方windows 7 旗舰版

热门文章

  1. 安卓App的启动过程、安卓布局分类及布局和页面的关系
  2. Android Studio项目结构介绍
  3. 江苏一动物园现“旋转活马” 园方:创意来自马术训练
  4. Hive数据类型及文本文件数据编码
  5. 智慧城市免费WiFi覆盖怎么实施?武邑开启智慧生活模式
  6. python语言特性-------python2.7教程学习【廖雪峰版】(一)
  7. 实现html锚点的两种方式
  8. Spring入门5.事务管理机制
  9. 彻底解决.net中编码问题的心得
  10. vb趣味编程弹球小游戏_最好玩的微信小游戏集合,总有一款是你没玩过的