与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的选择框相关推荐

  1. Java开发笔记(五十六)利用枚举类型实现高级常量

    前面介绍了联合利用final和static可实现常量的定义,该方式用于简单的常量倒还凑合,要是用于复杂的.安全性高的常量,那就力不从心了.例如以下几种情况,final结合static的方式便缺乏应对之 ...

  2. Java开发笔记(八十六)通过缓冲区读写文件

    前面介绍了利用文件写入器和文件读取器来读写文件,因为FileWriter与FileReader读写的数据以字符为单位,所以这种读写文件的方式被称作"字符流I/O",其中字母I代表输 ...

  3. Java开发笔记(八十八)文件字节I/O流

    前面介绍了如何使用字符流读写文件,并指出字符流工具的处理局限,进而给出随机文件工具加以改进.随机文件工具除了支持访问文件内部的任意位置,更关键的一点是通过字节数组读写文件数据,采取字节方式比起字符方式 ...

  4. Java开发笔记(五十)几种开放性修饰符

    前面介绍子类继承父类的时候,提到了public(公共)和private(私有)两个修饰符,其中public表示它所修饰的实体是允许外部访问的:而private表示它所修饰的实体不允许外部访问,只能在当 ...

  5. Java开发笔记(二十三)数组工具Arrays

    数组作为一种组合形式的数据类型,必然要求提供一些处理数组的简便办法,包括数组比较.数组复制.数组排序等等.为此Java专门设计了Arrays工具,该工具包含了几个常用方法,方便程序员对数组进行加工操作 ...

  6. Android开发笔记(八十八)同步与加锁

    同步synchronized 同步方法 synchronized可用来给方法或者代码块加锁,当它修饰一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码.这就意味着,当两个并发线程同时访 ...

  7. Android开发笔记(八十六)几个特殊的类

    接口interface interface是一些功能的集合,但它只定义了对象必须实现的成员,而不包含成员的实现代码,成员的具体代码由实现接口的类提供.Android对接口的使用场景主要有三类:事件监听 ...

  8. Android开发笔记(七十九)资源与权限校验

    硬件资源 因为移动设备的硬件配置各不相同,为了防止使用了不存在的设备资源,所以要对设备的硬件情况进行检查.一般情况下,前置摄像头.部分传感器在低端手机上是没有的,像SD卡也可能因为用户没插卡使得找不到 ...

  9. Android开发笔记(七十五)内存泄漏的处理

    内存泄漏的原因 一直以来以为只有C/C++才存在内存泄漏的问题,没想到拥有内存回收机制的Java也可能出现内存泄漏.C/C++存在指针的概念,程序中需要使用指针变量时,就从内存中开辟一块区域,并把该区 ...

  10. Android开发笔记(六十八)工程库打包

    写好一个Android模块,比如说一个自定义控件或某个功能的sdk,然后开放出来给别人使用,就得通过某种方式把源码提供给对方.常见的打包方式有: 一.直接给源码,由开发者把代码加入到自己的工程中 该方 ...

最新文章

  1. 我是如何设计 Upload 上传组件的
  2. 替换证件照背景颜色仅需十行Python代码
  3. 关于稳定性和故障的一点思考,每个互联网公司都吃过这个亏!
  4. [Python人工智能] 十三.如何评价神经网络、loss曲线图绘制、图像分类案例的F值计算
  5. 【hadoop】java 获取 yarn app 信息 报错 ConfiguredRMFailoverProxyProvider - Failing over to rm2
  6. opencv中java的dmatch_关于OpenCV的那些事——ORB的brief描述子(256bit)的match心得
  7. Unity3D基础16:网格过滤器和渲染器
  8. woocommerce 新增一个订单状态
  9. 团队展示——我说的都队
  10. Android App开机自启动
  11. OtterCTF 内存取证
  12. 软件插件化,大势所趋新势力
  13. python不显示边框_python设置表格边框的具体方法
  14. redis,Spring Cache,Mango,ES
  15. 谢希仁计算机网络常考知识点,《计算机网络》复习笔记--谢希仁
  16. 十种常用算法之分治算法(java版)
  17. Lua与C语言的互相调用
  18. WAVE音频文件格式及其64位扩展格式的简要介绍
  19. 大学四年,如何成为编程知识体系完整的应届生?
  20. 部署nginx版本升级

热门文章

  1. 九、Linux 软件包安装
  2. html中radio实现互斥
  3. Error creating bean with name 'rocketMQTemplate' defined in class path resource
  4. CentOS6.x 升级 CentOS7.1
  5. Java 加密扩展(JCE)框架 之 Cipher 加密与解密
  6. 5)Thymeleaf 模板布局 th:fragment、th:replace、th:insert、th:remove
  7. cd4017引脚图及功能_芯片CD4017解析
  8. 阶段5 3.微服务项目【学成在线】_day01 搭建环境 CMS服务端开发_12-MongoDb入门-基础概念...
  9. 小D课堂 - 零基础入门SpringBoot2.X到实战_第9节 SpringBoot2.x整合Redis实战_37、分布式缓存Redis介绍...
  10. centos6.4-x86-64系统更新系统自带Apache Http Server