Java开发笔记(一百四十)JavaFX的选择框
与Swing一样,JavaFX依然提供了三种选择框,它们是复选框CheckBox、单选按钮RadioButton、下拉框ComboBox,分别说明如下:
一、复选框CheckBox
复选框允许同时勾选多个,已勾选的时候在方框内部打个勾,未勾选的时候显示空心方框。查看CheckBox的源码,发现它与Button控件都派生自抽象类ButtonBase,因而CheckBox拥有和Button同样的set***/get***方法。不同之处主要有以下两点:
1、关于勾选状态的设置与判断:调用setSelected方法可以设置复选框的勾选状态,调用isSelected方法可以判断复选框是否被勾选了。
2、关于勾选监听器的设置:先调用selectedProperty方法获得复选框的属性对象,再调用属性对象的addListener方法设置该复选框的勾选监听器。下面是给复选框设置单击监听器的代码例子:
CheckBox ck = new CheckBox("满意"); // 创建一个复选框ck.selectedProperty().addListener(new ChangeListener<Boolean>() { // 设置复选框的勾选监听器@Overridepublic void changed(ObservableValue<? extends Boolean> arg0, Boolean arg1, Boolean arg2) {// 单击复选框会触发这里的changed方法}});
接下来举个具体的案例,餐厅的点餐系统要在界面上罗列各种菜肴,以便顾客勾选准备下单的菜品。简单起见先列出三道菜肴,对应三个复选框,编写完成的界面代码示例如下:
// 获取复选框的界面private void getCheckBox(BorderPane borderPane) {VBox vbox = new VBox(); // 创建一个垂直箱子HBox hbox = new HBox(); // 创建一个水平箱子CheckBox ck1 = new CheckBox("麻婆豆腐"); // 创建一个复选框CheckBox ck3 = new CheckBox("清蒸桂花鱼"); // 创建一个复选框CheckBox ck2 = new CheckBox("香辣小龙虾"); // 创建一个复选框hbox.getChildren().addAll(ck1, ck2, ck3); // 把三个复选框一起加到水平箱子上CheckBox[] boxArray = new CheckBox[]{ck1, ck2, ck3}; // 构建复选框数组Label label = new Label("这里查看菜单详情"); // 创建一个标签label.setWrapText(true); // 设置标签文本是否支持自动换行vbox.getChildren().addAll(hbox, label); // 把水平箱子和标签一起加到垂直箱子上ck1.selectedProperty().addListener(new ChangeListener<Boolean>() { // 设置复选框的勾选监听器@Overridepublic void changed(ObservableValue<? extends Boolean> arg0, Boolean arg1, Boolean arg2) {// 拼接并显示当前的勾选结果,以及已经勾选的菜肴label.setText(String.format("您%s了%s。当前已点菜肴包括:%s",(ck1.isSelected() ? "点" : "取消"), ck1.getText(), getCheckedItem(boxArray)));}});ck2.selectedProperty().addListener(new ChangeListener<Boolean>() { // 设置复选框的勾选监听器@Overridepublic void changed(ObservableValue<? extends Boolean> arg0, Boolean arg1, Boolean arg2) {// 拼接并显示当前的勾选结果,以及已经勾选的菜肴label.setText(String.format("您%s了%s。当前已点菜肴包括:%s",(ck2.isSelected() ? "点" : "取消"), ck2.getText(), getCheckedItem(boxArray)));}});ck3.selectedProperty().addListener(new ChangeListener<Boolean>() { // 设置复选框的勾选监听器@Overridepublic void changed(ObservableValue<? extends Boolean> arg0, Boolean old_value, Boolean new_value) {// 拼接并显示当前的勾选结果,以及已经勾选的菜肴label.setText(String.format("您%s了%s。当前已点菜肴包括:%s",(ck3.isSelected() ? "点" : "取消"), ck3.getText(), getCheckedItem(boxArray)));}});borderPane.setCenter(vbox); // 把垂直箱子放到边界窗格的中央}
上面代码用到了新方法getCheckedItem,该方法用来获取已经选中的所有菜肴,它的代码定义如下所示:
// 获取已经选定的菜单private String getCheckedItem(CheckBox[] boxArray) {String itemDesc = "";for (CheckBox box : boxArray) { // 遍历复选框数组if (box.isSelected() == true) { // 复选框被选中了if (itemDesc.length() > 0) {itemDesc = itemDesc + "、";}itemDesc = itemDesc + box.getText(); // 菜单添加选定的菜肴}}return itemDesc;}
运行包含以上代码的点餐程序,弹出的窗口初始界面如下图所示。
从左往右依次单击三个复选框,界面上的点餐结果分别如下列三张图所示。
二、单选按钮RadioButton
在同一小组内的单选按钮,最多只能选择其中一个,它被选中时在圆圈内部显示一个圆点,未选中时只显示空心圆圈。RadioButton也由ButtonBase派生而来,因此拥有与Button控件同样的set***/get***方法。区别之处主要有下列两点:
1、关于加入到一个单选小组:调用单选按钮的setToggleGroup方法,即可加入到指定的按钮小组,该小组的控件类型是ToggleGroup。
2、关于单选按钮的选择监听器:JavaFX把这个监听器改到小组上面了,先调用ToggleGroup对象的selectedToggleProperty方法获得单选组的属性对象,再调用属性对象的addListener方法设置该小组的单击监听器。
仍然以点餐系统为例,这次准备让顾客享用单点的快餐,小店刚开业暂时只提供三种快餐,对应三个单选按钮,编写完成的界面代码示例如下:
// 获取单选按钮的界面private void getRadioButton(BorderPane borderPane) {VBox vbox = new VBox(); // 创建一个垂直箱子HBox hbox = new HBox(); // 创建一个水平箱子RadioButton rb1 = new RadioButton("鱼香肉丝饭"); // 创建一个单选按钮rb1.setSelected(true); // 设置按钮是否选中RadioButton rb2 = new RadioButton("香菇滑鸡饭"); // 创建一个单选按钮RadioButton rb3 = new RadioButton("黑椒牛排饭"); // 创建一个单选按钮hbox.getChildren().addAll(rb1, rb2, rb3); // 把三个单选按钮一起加到水平箱子上ToggleGroup group = new ToggleGroup(); // 创建一个按钮小组rb1.setToggleGroup(group); // 把单选按钮1加入到按钮小组rb2.setToggleGroup(group); // 把单选按钮2加入到按钮小组rb3.setToggleGroup(group); // 把单选按钮3加入到按钮小组Label label = new Label("这里查看点餐结果"); // 创建一个标签label.setWrapText(true); // 设置标签文本是否支持自动换行vbox.getChildren().addAll(hbox, label); // 把水平箱子和标签一起加到垂直箱子上// 设置单选组合的单击监听器group.selectedToggleProperty().addListener(new ChangeListener<Toggle>() {@Overridepublic void changed(ObservableValue<? extends Toggle> arg0, Toggle old_toggle, Toggle new_toggle) {// 在标签上显示当前选中的单选按钮文本label.setText("您点了" + ((RadioButton)new_toggle).getText());}});borderPane.setCenter(vbox); // 把垂直箱子放到边界窗格的中央}
运行包含以上代码的点餐程序,弹出的窗口初始界面如下图所示。
从图示可见当前默认选中了第一个快餐“鱼香肉丝饭”,此时先后单击第二个快餐和第三个快餐,界面上的点餐结果分别如下列两张图所示。
三、下拉框ComboBox
如果单选小组里面的选项有很多,全部罗列到窗口上势必占用大量界面空间,故而采用可伸缩的下拉框较为合适。平时只显示最近一次选中的文字,需要改变的话再单击弹出下拉列表,在下拉列表中选完再恢复原状。看起来JavaFX的下拉框跟Swing的功能差不多,不过JavaFX的ComboBox控件用起来颇为怪异,有下面几点需要特别注意:
1、关于选中某项以及获取选中项:得先调用下拉框的getSelectionModel方法获得模型对象,再调用模型对象的相应方法完成指定功能。例如,调用模型对象的select方法可以选中某项,调用getSelectedIndex方法可以获得选中项的序号,调用getSelectedItem方法可以获得选中项的对象。
2、关于设置下拉框的字体:ComboBox控件竟然没提供setFont方法,只能调用setStyle方法通过css样式设置文本字体及其大小。
3、关于设置下拉框的选择监听器:这个操作更复杂,要先调用下拉框的getSelectionModel方法获得模型对象,再调用模型对象的selectedItemProperty方法获得该模型的属性对象,接着调用属性对象的addListener方法给下拉框添加选择监听器。
继续以点餐系统为例,原来那家快餐店的生意日趋红火,快餐种类增加了不少,他们的点餐系统也将单选小组改造成了下拉框。改造完成的界面代码示例如下:
// 获取下拉框的界面private void getComboBox(BorderPane borderPane) {VBox vbox = new VBox(); // 创建一个垂直箱子// 初始化快餐列表List<String> snackList = Arrays.asList("鱼香肉丝饭", "香菇滑鸡饭", "黑椒牛排饭","梅菜扣肉饭", "糖醋里脊饭", "红烧排骨饭", "台式卤肉饭");// 把清单对象转换为JavaFX控件能够识别的数据对象ObservableList<String> obList = FXCollections.observableArrayList(snackList);ComboBox<String> comboBox = new ComboBox<String>(obList); // 依据指定数据创建下拉框//comboBox.setItems(obList); // 设置下拉框的数据来源comboBox.getSelectionModel().select(0); // 设置下拉框默认选中第1项Font font = Font.font("NSimSun", 16); // 创建一个字体对象comboBox.setStyle(String.format("-fx-font: %f \"%s\";", font.getSize(), font.getFamily())); // 设置下拉框的字体comboBox.setEditable(false); // 设置下拉框能否编辑。默认不允许编辑Label label = new Label("这里查看点餐结果"); // 创建一个标签label.setWrapText(true); // 设置标签文本是否支持自动换行vbox.getChildren().addAll(comboBox, label); // 把水平箱子和标签一起加到垂直箱子上// 设置下拉框的选择监听器comboBox.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<String>() {@Overridepublic void changed(ObservableValue<? extends String> arg0, String old_str, String new_str) {// getSelectedIndex方法可获得选中项的序号,getSelectedItem方法可获得选中项的对象String desc = String.format("您点了第%d项,快餐名称是%s", comboBox.getSelectionModel().getSelectedIndex(), comboBox.getSelectionModel().getSelectedItem().toString());label.setText(desc); // 在标签上显示当前选中的文本项}});borderPane.setCenter(vbox); // 把垂直箱子放到边界窗格的中央}
运行包含以上代码的点餐程序,弹出的窗口初始界面如下图所示。
单击下拉框控件,下方弹出一个包含所有快餐的列表框,具体界面如下图所示。
单击下拉列表中的某一项,表示换成指定的快餐,此时下拉列表隐藏,下拉框的文字变成刚点的快餐名称,点餐结果正如下图所示。
更多Java技术文章参见《Java开发笔记(序)章节目录》
转载于:https://www.cnblogs.com/pinlantu/p/11391211.html
Java开发笔记(一百四十)JavaFX的选择框相关推荐
- Java开发笔记(五十六)利用枚举类型实现高级常量
前面介绍了联合利用final和static可实现常量的定义,该方式用于简单的常量倒还凑合,要是用于复杂的.安全性高的常量,那就力不从心了.例如以下几种情况,final结合static的方式便缺乏应对之 ...
- Java开发笔记(八十六)通过缓冲区读写文件
前面介绍了利用文件写入器和文件读取器来读写文件,因为FileWriter与FileReader读写的数据以字符为单位,所以这种读写文件的方式被称作"字符流I/O",其中字母I代表输 ...
- Java开发笔记(八十八)文件字节I/O流
前面介绍了如何使用字符流读写文件,并指出字符流工具的处理局限,进而给出随机文件工具加以改进.随机文件工具除了支持访问文件内部的任意位置,更关键的一点是通过字节数组读写文件数据,采取字节方式比起字符方式 ...
- Java开发笔记(五十)几种开放性修饰符
前面介绍子类继承父类的时候,提到了public(公共)和private(私有)两个修饰符,其中public表示它所修饰的实体是允许外部访问的:而private表示它所修饰的实体不允许外部访问,只能在当 ...
- Java开发笔记(二十三)数组工具Arrays
数组作为一种组合形式的数据类型,必然要求提供一些处理数组的简便办法,包括数组比较.数组复制.数组排序等等.为此Java专门设计了Arrays工具,该工具包含了几个常用方法,方便程序员对数组进行加工操作 ...
- Android开发笔记(八十八)同步与加锁
同步synchronized 同步方法 synchronized可用来给方法或者代码块加锁,当它修饰一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码.这就意味着,当两个并发线程同时访 ...
- Android开发笔记(八十六)几个特殊的类
接口interface interface是一些功能的集合,但它只定义了对象必须实现的成员,而不包含成员的实现代码,成员的具体代码由实现接口的类提供.Android对接口的使用场景主要有三类:事件监听 ...
- Android开发笔记(七十九)资源与权限校验
硬件资源 因为移动设备的硬件配置各不相同,为了防止使用了不存在的设备资源,所以要对设备的硬件情况进行检查.一般情况下,前置摄像头.部分传感器在低端手机上是没有的,像SD卡也可能因为用户没插卡使得找不到 ...
- Android开发笔记(七十五)内存泄漏的处理
内存泄漏的原因 一直以来以为只有C/C++才存在内存泄漏的问题,没想到拥有内存回收机制的Java也可能出现内存泄漏.C/C++存在指针的概念,程序中需要使用指针变量时,就从内存中开辟一块区域,并把该区 ...
- Android开发笔记(六十八)工程库打包
写好一个Android模块,比如说一个自定义控件或某个功能的sdk,然后开放出来给别人使用,就得通过某种方式把源码提供给对方.常见的打包方式有: 一.直接给源码,由开发者把代码加入到自己的工程中 该方 ...
最新文章
- 我是如何设计 Upload 上传组件的
- 替换证件照背景颜色仅需十行Python代码
- 关于稳定性和故障的一点思考,每个互联网公司都吃过这个亏!
- [Python人工智能] 十三.如何评价神经网络、loss曲线图绘制、图像分类案例的F值计算
- 【hadoop】java 获取 yarn app 信息 报错 ConfiguredRMFailoverProxyProvider - Failing over to rm2
- opencv中java的dmatch_关于OpenCV的那些事——ORB的brief描述子(256bit)的match心得
- Unity3D基础16:网格过滤器和渲染器
- woocommerce 新增一个订单状态
- 团队展示——我说的都队
- Android App开机自启动
- OtterCTF 内存取证
- 软件插件化,大势所趋新势力
- python不显示边框_python设置表格边框的具体方法
- redis,Spring Cache,Mango,ES
- 谢希仁计算机网络常考知识点,《计算机网络》复习笔记--谢希仁
- 十种常用算法之分治算法(java版)
- Lua与C语言的互相调用
- WAVE音频文件格式及其64位扩展格式的简要介绍
- 大学四年,如何成为编程知识体系完整的应届生?
- 部署nginx版本升级
热门文章
- 九、Linux 软件包安装
- html中radio实现互斥
- Error creating bean with name 'rocketMQTemplate' defined in class path resource
- CentOS6.x 升级 CentOS7.1
- Java 加密扩展(JCE)框架 之 Cipher 加密与解密
- 5)Thymeleaf 模板布局 th:fragment、th:replace、th:insert、th:remove
- cd4017引脚图及功能_芯片CD4017解析
- 阶段5 3.微服务项目【学成在线】_day01 搭建环境 CMS服务端开发_12-MongoDb入门-基础概念...
- 小D课堂 - 零基础入门SpringBoot2.X到实战_第9节 SpringBoot2.x整合Redis实战_37、分布式缓存Redis介绍...
- centos6.4-x86-64系统更新系统自带Apache Http Server