JavaFX UI控件教程(十五)之Combo Box

翻译自   Combo Box

本章介绍如何在JavaFX应用程序中使用组合框。它讨论了可编辑和不可编辑的组合框,教您如何跟踪可编辑组合框中的更改并处理它们上的事件,并解释如何使用单元工厂来更改组合框的默认实现。

组合框是用户界面的典型元素,使用户可以选择多个选项之一。当要显示的项目数超过某个限制时,组合框很有用,因为它可以将滚动添加到下拉列表中,与选择框不同。如果项目数量不超过某个限制,开发人员可以决定组合框或选择框是否更符合他们的需求。

您可以使用ComboBoxJavaFX API 的类在JavaFX应用程序中创建组合框。图14-1显示了具有两个组合框的应用程序。

图14-1两个组合框的应用

 

创建组合框

当创建一个组合框,你必须实例化ComboBox类,并定义项目作为观察的名单,就像如其他UI控件ChoiceBoxListView以及TableView。例14-1设置构造函数中的项。

示例14-1创建带有可观察列表的组合框

ObservableList<String> options = FXCollections.observableArrayList("Option 1","Option 2","Option 3");
final ComboBox comboBox = new ComboBox(options);

另一种可能性是使用空构造函数创建一个组合框并setItems在其上调用方法,如下所示:comboBox.setItems(options);

将组合框添加到应用程序场景后,它将显示在用户界面中,如图14-2所示。

图14-2包含三个项目的组合框

您可以随时使用新值补充项目列表。例14-2通过向comboBox控件添加另外三个项来实现此任务。

示例14-2将项添加到组合框

comboBox.getItems().addAll("Option 4","Option 5","Option 6"
);

ComboBox类提供方便的属性和方法与组合框使用。

您可以使用该setValue方法指定组合框中选定的项目。在对象setValue上调用方法时ComboBoxselectionModel即使该值不在组合框项目列表中,属性的选定项也会更改为此值。如果项目列表随后更改为包含此值,则会选择相应的项目。

同样,您可以通过调用getValue方法获取所选项的值。当用户选择项目时,selectionModel属性的选定项目和组合框value属性都更新为新值。

您还可以在ComboBox显示时限制下拉列表中的可见行数。以下代码行可以显示comboBox控件的三个项目:comboBox.setVisibleRowCount(3)作为调用此方法的结果,可见行数限制为3,并出现滚动条(如图14-3所示)。

图14-3设置组合框的可见行数

尽管ComboBox该类具有通用符号并且允许用户使用各种类型的项填充它,但不要使用Node(或任何子类)作为类型。因为场景图概念意味着只有一个Node对象可以位于应用程序场景的一个位置,所以从ComboBox项列表中删除所选项。当选择更改时,先前选择的项目将返回到列表,并删除新选择。要防止出现这种情况,请使用单元工厂机制和API文档中描述的解决方案。当您需要更改对象的初始行为或外观时,单元工厂机制特别有用ComboBox

ComboBoxSample应用程序旨在说明如何在典型的电子邮件界面中使用组合框。例14-3创建了一个这样的界面,其中使用两个组合框来选择电子邮件收件人和邮件的优先级。

示例14-3创建组合框并将其添加到场景中

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;public class ComboBoxSample extends Application {public static void main(String[] args) {launch(args);}final Button button = new Button ("Send");final Label notification = new Label ();final TextField subject = new TextField("");final TextArea text = new TextArea ("");String address = " ";@Override public void start(Stage stage) {stage.setTitle("ComboBoxSample");Scene scene = new Scene(new Group(), 450, 250);final ComboBox emailComboBox = new ComboBox();emailComboBox.getItems().addAll("jacob.smith@example.com","isabella.johnson@example.com","ethan.williams@example.com","emma.jones@example.com","michael.brown@example.com"  );final ComboBox priorityComboBox = new ComboBox();priorityComboBox.getItems().addAll("Highest","High","Normal","Low","Lowest" );   priorityComboBox.setValue("Normal");GridPane grid = new GridPane();grid.setVgap(4);grid.setHgap(10);grid.setPadding(new Insets(5, 5, 5, 5));grid.add(new Label("To: "), 0, 0);grid.add(emailComboBox, 1, 0);grid.add(new Label("Priority: "), 2, 0);grid.add(priorityComboBox, 3, 0);grid.add(new Label("Subject: "), 0, 1);grid.add(subject, 1, 1, 3, 1);            grid.add(text, 0, 2, 4, 1);grid.add(button, 0, 3);grid.add (notification, 1, 3, 3, 1);Group root = (Group)scene.getRoot();root.getChildren().add(grid);stage.setScene(scene);stage.show();}    
}

例14-3中的两个组合框都使用getItemsaddAll方法来添加项目。编译并运行此代码时,它会生成如图14-4所示的应用程序窗口。

图14-4电子邮件收件人和优先级组合框

 

可编辑的组合框

通常,电子邮件客户端应用程序使用户能够从地址簿中选择收件人并键入新地址。可编辑的组合框非常适合此任务。使用类的setEditable(true)方法ComboBox使组合框可编辑。使用此setPromptText方法,您可以指定在未执行选择时显示在组合框编辑区域中的文本。检查示例14-4中的应用程序的修改代码。粗线是对例14-3的补充。

示例14-4在可编辑的组合框中处理新键入的值

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;public class ComboBoxSample extends Application {public static void main(String[] args) {launch(args);}final Button button = new Button ("Send");final Label notification = new Label ();final TextField subject = new TextField("");final TextArea text = new TextArea ("");String address = " ";@Override public void start(Stage stage) {stage.setTitle("ComboBoxSample");Scene scene = new Scene(new Group(), 450, 250);final ComboBox emailComboBox = new ComboBox();emailComboBox.getItems().addAll("jacob.smith@example.com","isabella.johnson@example.com","ethan.williams@example.com","emma.jones@example.com","michael.brown@example.com"  );emailComboBox.setPromptText("Email address");emailComboBox.setEditable(true);        emailComboBox.valueProperty().addListener(new ChangeListener<String>() {@Override public void changed(ObservableValue ov, String t, String t1) {                address = t1;                }    });final ComboBox priorityComboBox = new ComboBox();priorityComboBox.getItems().addAll("Highest","High","Normal","Low","Lowest" );   priorityComboBox.setValue("Normal");button.setOnAction(new EventHandler<ActionEvent>() {@Overridepublic void handle(ActionEvent e) {//do something}});         GridPane grid = new GridPane();grid.setVgap(4);grid.setHgap(10);grid.setPadding(new Insets(5, 5, 5, 5));grid.add(new Label("To: "), 0, 0);grid.add(emailComboBox, 1, 0);grid.add(new Label("Priority: "), 2, 0);grid.add(priorityComboBox, 3, 0);grid.add(new Label("Subject: "), 0, 1);grid.add(subject, 1, 1, 3, 1);            grid.add(text, 0, 2, 4, 1);grid.add(button, 0, 3);grid.add (notification, 1, 3, 3, 1);Group root = (Group)scene.getRoot();root.getChildren().add(grid);stage.setScene(scene);stage.show();}    
}

除了编辑功能外emailComboBox,此代码片段还实现了此控件的事件处理。新键入或选择的值存储在address变量中。当用户按“发送”按钮时,将显示包含电子邮件地址的通知。

图14-5显示了用户编辑Jacob Smith的电子邮件地址并将其更改为greg.smith@example.com的时刻。

图14-5编辑电子邮件地址

按下发送按钮后,所有控件都将返回其默认状态。该clear方法被称为上TextFieldTextArea对象和null值设置为组合框中选定的项目。图14-6显示了按下发送按钮后的时刻。

图14-6按下发送按钮后的用户界面

 

将Cell Factories应用于组合框

您可以使用单元工厂机制来更改组合框的默认行为或外观。例14-5创建了一个单元工厂并将其应用于优先级组合框以突出显示具有特殊颜色的优先级类型。

示例14-5为优先级组合框实现单元工厂

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.GridPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.util.Callback;public class ComboBoxSample extends Application {public static void main(String[] args) {launch(args);}final Button button = new Button ("Send");final Label notification = new Label ();final TextField subject = new TextField("");final TextArea text = new TextArea ("");String address = " ";@Override public void start(Stage stage) {stage.setTitle("ComboBoxSample");Scene scene = new Scene(new Group(), 450, 250);final ComboBox emailComboBox = new ComboBox();emailComboBox.getItems().addAll("jacob.smith@example.com","isabella.johnson@example.com","ethan.williams@example.com","emma.jones@example.com","michael.brown@example.com"  );emailComboBox.setPromptText("Email address");emailComboBox.setEditable(true);        emailComboBox.valueProperty().addListener(new ChangeListener<String>() {@Override public void changed(ObservableValue ov, String t, String t1) {                address = t1;                }    });final ComboBox priorityComboBox = new ComboBox();priorityComboBox.getItems().addAll("Highest","High","Normal","Low","Lowest" );   priorityComboBox.setValue("Normal");priorityComboBox.setCellFactory(new Callback<ListView<String>, ListCell<String>>() {@Override public ListCell<String> call(ListView<String> param) {final ListCell<String> cell = new ListCell<String>() {{super.setPrefWidth(100);}    @Override public void updateItem(String item, boolean empty) {super.updateItem(item, empty);if (item != null) {setText(item);    if (item.contains("High")) {setTextFill(Color.RED);}else if (item.contains("Low")){setTextFill(Color.GREEN);}else {setTextFill(Color.BLACK);}}else {setText(null);}}};return cell;}});button.setOnAction(new EventHandler<ActionEvent>() {@Overridepublic void handle(ActionEvent e) {if (emailComboBox.getValue() != null && !emailComboBox.getValue().toString().isEmpty()){notification.setText("Your message was successfully sent"+ " to " + address);   emailComboBox.setValue(null);if (priorityComboBox.getValue() != null && !priorityComboBox.getValue().toString().isEmpty()){priorityComboBox.setValue(null);}subject.clear();text.clear();}else {notification.setText("You have not selected a recipient!"); }}});GridPane grid = new GridPane();grid.setVgap(4);grid.setHgap(10);grid.setPadding(new Insets(5, 5, 5, 5));grid.add(new Label("To: "), 0, 0);grid.add(emailComboBox, 1, 0);grid.add(new Label("Priority: "), 2, 0);grid.add(priorityComboBox, 3, 0);grid.add(new Label("Subject: "), 0, 1);grid.add(subject, 1, 1, 3, 1);            grid.add(text, 0, 2, 4, 1);grid.add(button, 0, 3);grid.add (notification, 1, 3, 3, 1);Group root = (Group)scene.getRoot();root.getChildren().add(grid);stage.setScene(scene);stage.show();}    
}

细胞工厂生产ListCell物体。每个单元格都与一个组合框项目相关联。通过该setPrefWidth方法设置每个组合框项的宽度。该updateItem方法为“高”和“最高”项设置红色,为“低”和“最低”项设置绿色,并将“正常”项设置为黑色。

图14-7显示了应用示例14-5中的单元工厂后优先级组合框的项目。

图14-7修改了优先级组合框

 

您可以ComboBox通过应用CSS样式或视觉效果进一步增强控件的外观。

相关的API文档 

  • ComboBox

  • ComboBoxBase

  • ListView

  • ListCell

  • Button

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

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

相关文章

Boostrap技能点整理之【按钮样式】

昨天我们看了看bootstrap的网&#xff08;栅&#xff09;格系统&#xff0c;想必都对bootstrap网格系统有个大致的了解&#xff0c;今天我们再来看看bootstrap的按钮组合。按钮的样式在boostrap中&#xff0c;任何带有 class .btn 的元素都会继承圆角灰色按钮的默认外观。但是 …

MyBatis中的缓存

01 Mybatis中的缓存简介 缓存的好处&#xff1a;只是查询才有缓存 &#xff08;增删改没有缓存的&#xff09;&#xff0c;可以增块访问的速度 sqlsession级缓存 &#xff08;一级缓存&#xff09; 默认开启的 所有的操作是公用同一个SQLsession对象并且执行的是同一条SQL语句的…

基于VS2017的Docker Support体检ASP.NET Core站点的Docker部署

最近在学习如何用 Docker 部署生产环境中的 ASP.NET Core 站点&#xff0c;作为一个 Docer 新手&#xff0c;从何处下手更容易入门呢&#xff1f;一开始就手写 Docker 配置文件&#xff08;Docfile, docker-compose.yml&#xff09;容易让人产生挫败感&#xff0c;想到 Visual …

ssl1202-滑雪【记忆化搜索法】

Description Michael喜欢滑雪百这并不奇怪&#xff0c; 因为滑雪的确很刺激。可是为了获得速度&#xff0c;滑的区域必须向下倾斜&#xff0c;而且当你滑到坡底&#xff0c;你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长底滑坡。区域由一个二维数组…

break VS continue

使用范围 循环中使用的作用(不同点) 相同点 break: 循环结构中 结束当前循环 关键字后面不能声明执行语句 continue: 循环结构中 结束当次循环 关键字后面不能声明执行语句

JavaFX UI控件教程(十六)之Separator

翻译自 Separator 本章介绍如何使用分隔符组织JavaFX应用程序的UI组件。 SeparatorJavaFX API中可用的类表示水平或垂直分隔线。它用于划分应用程序用户界面的元素&#xff0c;不会产生任何操作。但是&#xff0c;您可以设置样式&#xff0c;对其应用视觉效果&#xff0c;甚…

eclipse下载与安装步骤详解,包含解决错误(最全最详细,多图)

以前一直用的是myeclipse,今天有幸接触eclipse,那我们就先来安装的配置一下&#xff0c;下载地址&#xff1a;公众号中回复常用软件下载&#xff0c;下载完成以后就可以安装了&#xff0c;首先我们来先安装jdk1.7,打开jdk的安装包双击即可&#xff0c;直接点击下一步&#xff1…

微软中国Azure开源开发者(深圳)研讨会

时间&#xff1a;2017年6月28日 地点&#xff1a;深圳福田香格里拉大酒店 微软开发技术与云平台自从迈向开放、开源、跨平台的转型以来&#xff0c;已经受到全球开源社区们的关注。从Github 上高居世界首位的开源项目贡献数量&#xff0c;可以看到微软贯彻开源战略的实际行动。…

MyBatis中ThreadLocal

01 遇到的问题 –如果我们做一个请求时候多次使用sqlsession对象这样就会造成sqlsession 浪费&#xff0c;也就是资源浪费&#xff0c;效率也会降低 –我们需要达到的目的就是用户发出的一个请求中实现sqlsession的共享 –请求没有改变&#xff0c;线程就不会改变 –最终的目的…

洛谷P1434-滑雪【线性化Dp】

Description Michael喜欢滑雪百这并不奇怪&#xff0c; 因为滑雪的确很刺激。可是为了获得速度&#xff0c;滑的区域必须向下倾斜&#xff0c;而且当你滑到坡底&#xff0c;你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长底滑坡。区域由一个二维数组…

JavaFX UI控件教程(十七)之Slider

翻译自 Slider 在本章中&#xff0c;您将学习如何在JavaFX应用程序中使用滑块来显示和与一系列数值进行交互。 该Slider控件由一个轨道和一个可拖动的拇指组成。它还可以包括刻度线和刻度标签&#xff0c;用于指示范围的数值。图16-1显示了一个典型的滑块并指出了它的主要元…

Photoshop中将图片拖不进软件的编辑区的解决方法,超详细

今天在学习ps的过程中&#xff0c;发现我的ps怎么和人家老师的不一样&#xff0c;怎么不一样呢&#xff1f;人家老师的ps5中&#xff0c;鼠标可以直接拖到ps的编辑栏中&#xff0c;可是我的死活拖不进去。怎么办&#xff1f;怎么办&#xff1f;经过自己瞎鼓捣和上网查&#xff…

IdentityServer4 指定角色授权(Authorize(Roles=amp;quot;adminamp;quot;))

1. 业务场景 IdentityServer4 授权配置Client中的AllowedScopes&#xff0c;设置的是具体的 API 站点名字&#xff0c;也就是使用方设置的ApiName&#xff0c;示例代码&#xff1a; //授权中心配置new Client{ ClientId "client_id_1", AllowedGrantTypes G…

MyBatis中的注解

代码实现 1. Select("select * from student") 2. List<Student> selectAll(); 3. 4. Select("select * from student where sid#{param1}") 5. Student selectOne(int id); 6. 7. Insert("insert into student value…

ssl1463-公共子串【各种dp之1】

前言&#xff1a; 开始水做练习题了&#xff0c;反正难度还是比较大的QAQ。比较dp。emmmmmmmmmmmmmmmmmmm 题目 大概就是给出两个字符串&#xff0c;蓝后让你求出他们相同的一串&#xff08;but可以不连续 不连续还叫子串&#xff1f;&#xff09;的长度。 输入 abcfbc abf…

JavaFX UI控件教程(十八)之Progress Bar和Progress Indicator

翻译自 Progress Bar and Progress Indicator 在本章中&#xff0c;您将了解进度指示器和进度条&#xff0c;以及可视化JavaFX应用程序中任何操作进度的UI控件。 本ProgressIndicator类及其直接子类ProgressBar所提供的功能&#xff0c;以表明特定的任务是处理和检测是如何工…

数组的初始化与默认值

初始化 一维数组 数组一旦初始化完成&#xff0c;其长度就确定了 int[] ids;//声明//1.1 静态初始化:数组的初始化和数组元素的赋值操作同时进行ids new int[]{1001,1002,1003,1004};//1.2动态初始化:数组的初始化和数组元素的赋值操作分开进行String[] names new String[5…

你不知道ADo.Net中操作数据库的步骤【超详细整理】

1.先创建数据库连接字符串&#xff1a; string strcon "Data Source.;Initial CatalogschoolDB;Integrated SecurityTrue";2.创建SqlConnection对象&#xff0c;需要注意的是SqlConnection对象在using System.Data.SqlClient;命名空间中。 SqlConnection conn new…

OJ4007-计算字符串距离【各种dp之2】

题目 大概&#xff08;又大概&#xff1f;&#xff09;就是输入t组数据&#xff0c;每组数据输入两个字符串&#xff08;又是两个字符串&#xff1f;&#xff09; 然后我们可以进行以下操作 1.修改一个字符&#xff08;如把“a”替换为“b”&#xff09; 2.删除一个字符&…

C# 7.2和8.0路线图

C# 7.2和8.0的许多新功能已经列入了计划&#xff0c;其中包括空引用类型和有限形式的多重继承。 只读引用和只读结构体 [7.2原型] 首先提到的是只读引用和结构体。简单来讲&#xff0c;这项特性使得C#能够使用类似const的参数来提高性能。像我们所知道的“ref只读参数”和简单…