JavaFX UI控件教程(二十八)之UI控件的自定义

翻译自  Customization of UI Controls

本章介绍了UI控件自定义的各个方面,并总结了Oracle提供的一些提示和技巧,以帮助您修改UI控件的外观和行为。

您可以通过应用层叠样式表(CSS),重新定义默认行为和使用单元工厂来学习如何从UIControlSamples项目中的示例应用程序自定义控件。对于更具体的情况,当应用程序的任务需要无法使用javafx.scene.control包的类实现的独特功能时,请扩展Control类以创建自己的控件。

应用CSS

您可以通过重新定义JavaFX caspian样式表的样式定义来更改UI控件的外观。使用CSS为JavaFX应用程序设置外观说明了在JavaFX应用程序中修改样式并启用它们的一般概念和方法。

考虑开发人员在JavaFX论坛上经常请求的一些特定任务。

虽然Tooltip该类没有任何属性或方法来更改工具提示的默认颜色,但您可以修改CSS类的-fx-background-color属性,.tooltip如例27-1所示。

示例27-1更改工具提示的背景颜色

.tooltip {    -fx-background-color: linear-gradient(#e2ecfe, #99bcfd);
}
.page-corner {-fx-background-color: linear-gradient(from 0% 0% to 50% 50%,#3278fa,#99bcfd);
}

.page-cornerCSS类定义了提示的右下角的颜色。将示例27-1中的代码添加到TooltipSample的样式表并将样式表应用于场景时,工具提示将其颜色更改为蓝色。请参见图27-1以评估效果。

图27-1具有蓝色背景颜色的工具提示

请注意,修改工具提示的默认样式时,新外观将应用于应用程序中的所有工具提示。

另一个流行的设计任务是更改控件的默认标记。例如,类的默认样式CheckBox定义了所选状态的传统复选标记。您可以重新定义标记的形状及其颜色,如例27-2所示。

示例27-2复选框的替代标记

.check-box .mark {-fx-shape:
"M2,0L5,4L8,0L10,0L10,2L6,5L10,8L10,10L8,10L5,6L2,10L0,10L0,8L4,5L0,2L0,0Z";
}
.check-box:selected .mark {-fx-background-color: #0181e2;
}

-fx-shape属性为标记设置新的SVG路径,-fx-background-color属性定义其颜色。在CheckBoxSample应用程序中启用修改后的样式表时,所选复选框包含X标记而不是复选标记,如图27-2所示。

图27-2带有修改的复选框样式的ComboBoxSample

许多开发人员询问如何克服视觉风格TableViewListView控件的限制。默认情况下,将显示这些控件中的所有行,无论它们是否为空。使用适当的CSS设置,您可以为所有空行设置特定颜色。例27-3为TableView控件实现此任务。

示例27-3在表视图中设置空行的颜色

.table-row-cell:empty {-fx-background-color: lightyellow;
}.table-row-cell:empty .table-cell {-fx-border-width: 0px;
}

第一种CSS样式确定所有空行,无论它们是偶数还是奇数,都应该具有浅黄色背景。当table-row-cell为空时,第二个CSS语句将删除在所有表格单元格右侧绘制的垂直边框。

在TableViewSample应用程序中启用示例27-3中的CSS样式时,Address Book表如图27-3所示。

图27-3将ColorView添加到空行的TableViewSample

您甚至可以设置null空单元格的背景颜色值。在这种情况下,样式表将使用表视图的默认背景颜色。请参见图27-4以评估效果。

图27-4将空背景颜色添加到空行的TableViewSample

您可以为UI控件设置更多CSS属性,以更改其形状,颜色方案和应用的效果。有关可用CSS属性和类的更多信息,请参阅“ JavaFX CSS参考指南”。

 

改变默认行为

许多开发人员要求使用特定的API来限制文本字段中的输入,例如,仅允许数字值。例27-4提供了一个带有数字文本字段的简单应用程序。

示例27-4禁止文本字段中的字母

import javafx.application.Application;
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.layout.HBox;
import javafx.stage.Stage;public class CustomTextFieldSample extends Application {final static Label label = new Label();@Overridepublic void start(Stage stage) {Group root = new Group();Scene scene = new Scene(root, 300, 150);stage.setScene(scene);stage.setTitle("Text Field Sample");GridPane grid = new GridPane();grid.setPadding(new Insets(10, 10, 10, 10));grid.setVgap(5);grid.setHgap(5);scene.setRoot(grid);final Label dollar = new Label("$");GridPane.setConstraints(dollar, 0, 0);grid.getChildren().add(dollar);final TextField sum = new TextField() {@Overridepublic void replaceText(int start, int end, String text) {if (!text.matches("[a-z, A-Z]")) {super.replaceText(start, end, text);                     }label.setText("Enter a numeric value");}@Overridepublic void replaceSelection(String text) {if (!text.matches("[a-z, A-Z]")) {super.replaceSelection(text);}}};sum.setPromptText("Enter the total");sum.setPrefColumnCount(10);GridPane.setConstraints(sum, 1, 0);grid.getChildren().add(sum);Button submit = new Button("Submit");GridPane.setConstraints(submit, 2, 0);grid.getChildren().add(submit);submit.setOnAction(new EventHandler<ActionEvent>() {@Overridepublic void handle(ActionEvent e) {label.setText(null);}});GridPane.setConstraints(label, 0, 1);GridPane.setColumnSpan(label, 3);grid.getChildren().add(label);scene.setRoot(grid);stage.show();}public static void main(String[] args) {launch(args);}
}

要重新定义类的默认实现TextField,必须覆盖从类继承的replaceTextreplaceSelection方法TextInputControl

当用户尝试在Sum文本字段中输入任何字母时,不会出现符号,并显示警告消息。图27-5说明了这种情况。

图27-5尝试输入字母符号

但是,当用户尝试输入数值时,它们会出现在字段中,如图27-6所示。

图27-6输入数字值

 

实施细胞工厂

通过使用单元工厂的机制,可以完全定制四个UI控件的外观甚至行为。您可以将电池工厂TableViewListViewTreeView,和ComboBox。单元工厂用于生成单元实例,用于表示这些控件的任何单个项。

Cell类扩展了Labeled类,它提供了所有必需的属性和方法,实行最典型的使用情况-显示和编辑文本。但是,当应用程序的任务需要在列表或表中显示图形对象时,您可以使用该graphic属性并将其放置Node在单元格中(有关自定义单元格的更多信息,请参阅Cell类API规范)。

例如,示例27-5中的代码片段为列表视图创建了一个单元工厂,并重新定义了updateItem方法中单元格的内容,以便列表显示不同颜色的矩形。

示例27-5为ListView控件实现单元工厂

list.setCellFactory(new Callback<ListView<String>, ListCell<String>>() {Override public ListCell<String> call(ListView<String> list) {return new ColorRectCell();}
});
...
static class ColorRectCell extends ListCell<String> {@Override public void updateItem(String item, boolean empty) {super.updateItem(item, empty);Rectangle rect = new Rectangle(100, 20);if (item != null) {rect.setFill(Color.web(item));setGraphic(rect);} else {setGraphic(null);}}
}

图27-7显示了此自定义列表在UIControlSamples项目的ListViewSample中的外观。

图27-7带有颜色矩形的列表视图

本教程广泛使用单元工厂机制来自定义UI控件。表27-1总结了可用于在应用程序上实现单元工厂的编码模板。

表27-1单元工厂编码模式

控制编码模式

ListView, ComboBox

list.setCellFactory(new Callback<ListView<String>,
ListCell<String>>() {    @Override public ListCell<String> call(ListView<String> list) {//cell implementation            }
});

TableView

column.setCellFactory(new Callback<TableColumn,TableCell>() {public TableCell call(TableColumn p) {//cell implementation                }        
});

TreeView

   tree.setCellFactory(new Callback<TreeView<String>, 
    TreeCell<String>>(){
            @Override
            public TreeCell<String> call(TreeView<String> p) {
                //cell implementation
            }
});

 

您可以使用单元工厂机制自定义这些控件,也可以使用预提供的单元编辑器实现来提供可视化底层的特定数据模型。表27-2列出了JavafX API中可用的相应类。

表27-2列表视图,树视图和表视图控件的单元编辑器类

控制单元格编辑器类

列表显示

  • CheckBoxListCell

  • ChoiceBoxListCell

  • ComboBoxListCell

  • TextFieldListCell

树视图

  • CheckBoxTreeCell

  • ChoiceBoxTreeCell

  • ComboBoxTreeCell

  • TextFieldTreeCell

表视图

  • CheckBoxTableCell

  • ChoiceBoxTableCell

  • ComboBoxTableCell

  • ProgressBarTableCell

  • TextFieldTableCell

每个单元格编辑器类在单元格内绘制一个特定节点。例如,CheckBoxListCell该类CheckBox在列表单元格内绘制一个节点。

要评估更多单元工厂和单元编辑器用例,请参阅表视图,树视图和组合框章节。

 

相关文档和资源 

  • 使用CSS进行皮肤应用

  • JavaFX CSS参考指南

  • JavaFX新闻,演示和洞察力

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

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

相关文章

好多人都说存储过程很难?认真看这篇文章就够了

何为存储过程&#xff1f;存储过程是在数据库管理系统中保存的、预先编译的并能实现某种功能的sql程序&#xff0c;说直白点&#xff0c;java知道吧&#xff1f;和java的方法一样。每遇到一个新的知识点时&#xff0c;我们都会看看它的优点&#xff0c;从而加深对它学习的欲望&…

下一代的 Actor 模型框架 Proto Actor

ProtoAct 是下一代的 Actor 模型框架&#xff0c;提供了 .NET 和 Go 语言的实现&#xff0c;默认支持分布式&#xff0c;提供管理和监控功能。在过去几年&#xff0c;我们经常看到两种 Actor 模型方法相互竞争&#xff0c;首先是经典的 Erlang/Akka 风格的 Actor 模型&#xff…

你知道i=i++;的含义吗?原理其实没有你想的那么简单

i和i我们都知道&#xff0c;但是你知道ii;吗&#xff1f;自上学时&#xff0c;老师就说i是先赋值再加&#xff0c;而i是先加再赋值&#xff0c;比如我们写个代码举下例子&#xff1a;i:/*** 自增案例*/public static void testZiZeng(){int i 1;int a i;System.out.println(&…

学会思考,而不只是编程

中国人常说“授之以鱼不如授之以渔”。如果说教授编程是授之以鱼&#xff0c;那么教授计算机科学就是授之以渔。为什么说学习计算机科学比学会编程要重要得多&#xff1f;来听听Yevgeniy Brikman的解释。 现如今&#xff0c;似乎每个人都在学习编程&#xff1a;Bill Gates、Ma…

ssl1562-局域网

局域网 题目 就是一个图&#xff0c;求最小生成树&#xff0c;然后求被去除的边的价值。 输入 用线来表示联通 5 5 1 2 8 1 3 1 1 5 3 2 4 5 3 4 2 输出 去除的边的总价值 8 解题思路 求出最小生成树的价值然后线的总值减去最小生成树的价值 代码 #include<…

什么?java中居然可以执行js代码了?真是不知者不怪

今天在书上看的&#xff0c;java中可以直接调用js的函数了&#xff0c;言外之意就是java已经支持外部的脚本语言了&#xff08;在运行期解释执行的&#xff09;&#xff0c;查了查&#xff0c;jdk从1.6之后开始支持的&#xff0c;1.6之前不可以。 为什么Java这种编译语言还需要…

用 Docker Machine 创建 Azure 虚拟主机

搭建环境向来是一个重复造轮子的过程&#xff0c;Docker Machine 则把用户搭建 Docker 环境的各种方案汇集在了一起。笔者在《Docker Machine 简介》一文中演示了使用 Docker Machine 在本地的 vSphere 主机中安装 Docker 环境。但是在云计算大爆炸的今天&#xff0c;真正让我们…

振华重工携手微软,开启港口运营数字化转型新纪元

上海振华重工&#xff08;集团&#xff09;股份有限公司&#xff08;ZPMC&#xff09;是重型装备制造行业的知名企业&#xff0c;是港口机械的领军者。企业的港口机械目前已销往93个国家和地区&#xff0c;全球占有率高达82%&#xff0c;多年保持行业领先的地位。 转型大计提上…

在JavaFX程序中嵌入Swing内容

转载自 在JavaFX程序中嵌入Swing内容 本教程描述如何在JavaFX应用程序中嵌入Swing组件。本文将讨论线程限制并提供一个可运行的应用程序来说明在JavaFX应用程序中嵌入带HTML内容的Swing按钮&#xff0c;以及Swing与JavaFX按钮间的协作性。 从JavaFX 2.0版本开始&#xff0c;…

你胆敢不加break试试?

我们经常在实际开发中会用到一些转换类&#xff0c;比如在金融界中&#xff0c;我们需要将1转换为“壹”&#xff0c;2转换成“贰”。还有类似这样的需求&#xff0c;食堂在一周内每天的菜单都是不一样的&#xff0c;周一为鱼香肉丝鸡腿&#xff0c;周二为爆炒土豆丝鲅鱼&#…

微软作为金牌会员加入Cloud Foundry基金会

在最近召开的Cloud Foundry峰会上&#xff0c;微软宣布他们已经加入了Cloud Foundry基金&#xff0c;成为金牌会员。除此之外&#xff0c;微软正在加大对开源云平台的支持力度&#xff0c;他们提供的服务包括Azure数据库&#xff08;PostgreSQL和MySQL&#xff09;的后端集成以…

你胆敢在case后面不加break试试?

我们经常在实际开发中会用到一些转换类&#xff0c;比如在金融界中&#xff0c;我们需要将1转换为“壹”&#xff0c;2转换成“贰”。还有类似这样的需求&#xff0c;食堂在一周内每天的菜单都是不一样的&#xff0c;周一为鱼香肉丝鸡腿&#xff0c;周二为爆炒土豆丝鲅鱼&#…

在Swing和Swt中使用JavaFX

转载自 在Swing和Swt中使用JavaFX 本人从08年12月份&#xff0c;JavaFX发布第一个版本开始关注它的发展。 算算到现在&#xff0c;也差不多是第五个年头了。期间经历了一些动荡&#xff0c;但JavaFX还是坚持着发展了下来&#xff0c;也经历了很多改变(这也是Java技术的特点&a…

活动: 北京Xamarin分享会第4期(2017年7月8日)

BXUG(Beijing Xamarin User Group)将举行第4期线下活动&#xff0c;本期内容预告&#xff1a; 案例演讲: "Xamarin原生跨平台开发的风险与收益"分享者: 神秘分享嘉宾Mike&#xff0c;来自国内一线互联网教育公司的研发经理&#xff0c;.NET新时代CTO联盟发起者。方案…

内存模型是怎么解决缓存一致性的

转载自 内存模型是怎么解决缓存一致性的 在再有人问你Java内存模型是什么&#xff0c;就把这篇文章发给他这篇文章中&#xff0c;我们介绍过关于Java内存模型的来龙去脉。 我们在文章中提到过&#xff0c;由于CPU和主存的处理速度上存在一定差别&#xff0c;为了匹配这种差距…

这是什么操作?java中的变量竟然可以先使用后声明?

相信大家在看到标题之后&#xff0c;是疑惑的点进来看内容的。 在看到标题之后&#xff0c;大家肯定会怀疑&#xff0c;我赵某人用java写了好几年的代码了&#xff0c;还真就没见过java中的变量能先用在声明&#xff0c;今天就是进来看看你在没有声明变量的前提下是怎么用的&a…

重写(override / overwrite)

方法的重写(override / overwrite) 1.重写&#xff1a;子类继承父类以后&#xff0c;可以对父类中同名同参数的方法&#xff0c;进行覆盖操作 2.应用&#xff1a;重写以后&#xff0c;当创建子类对象以后&#xff0c;通过子类对象调用子父类中的同名同参数的方法时&#xff0c;…

来吧学学.Net Core之项目文件简介及配置文件与IOC的使用

序言 在当前编程语言蓬勃发展与竞争的时期,对于我们.net从业者来说,.Net Core是风头正紧,势不可挡的.芸芸口水之中,不学习使用Core,你的圈内处境或许会渐渐的被边缘化.所以我们还是抽出一点点时间学学.net core吧. 那VS Code 可以编写,也可以调试Core本人也尝试啦下,但是感觉…

真正的问题应该在我身上……

渐渐地&#xff0c;学生已进入学习状态。在未测试之前&#xff0c;一直以为大家都学的很好&#xff0c;从课堂上的互动氛围就可以看得出来&#xff0c;一问问题&#xff0c;你一言他一语的……在测试之后&#xff0c;真是让我大跌眼镜&#xff0c;平时感觉表现很好的学生们&…

搞定计算机网络面试,看这篇就够了

转载自 搞定计算机网络面试&#xff0c;看这篇就够了 文章目录结构&#xff1a; 一 OSI与TCP/IP各层的结构与功能&#xff0c;都有哪些协议 运输层主要使用以下两种协议&#xff1a; UDP的主要特点&#xff1a; TCP的主要特点&#xff1a; 域名系统&#xff08;Domain Nam…