Swing应用程序中的JavaFX 8 DatePicker

1.概述

本文显示了一个使用JavaFX 8 DatePicker控件的Java SE 8 Swing应用程序的示例。

DatePicker控件允许用户以文本形式输入日期或从日历弹出窗口中选择日期。 本示例使用其中带有FX控件的Swing JFrame 。 为了将FX内容嵌入Swing应用程序中, javafx.embed.swing包提供了JFXPanel类。

该应用程序从日期选择器中获取一个输入日期,并检查它是否在用户选择的两个日期选择器中的日期范围内(从和到日期)。 日期选择器的日期验证包括:

  • 起始日期小于起始日期
  • 日期不是将来的日期
  • 输入日期在开始和结束日期(包括)之内

无效或有效消息显示在“ FX Alert对话框中。

以下两个屏幕截图显示了具有JFrame以及嵌入式FX控件(带有LabelDatePickerButton FXPanel )和DatePicker的日历弹出窗口的应用程序。

Swing JFrame中的FX控件

Swing JFrame中的FX控件

带有日历弹出的FX DatePicker

带有日历弹出的FX DatePicker

源代码

可从本文末尾提供的链接下载此示例FXDatePickerInSwingExample.java的源代码。 请注意,编译和运行代码需要Java SE 8。 Java SE 8包含JavaFX 8。

2.应用说明

从事件调度线程中的Java SE程序的main()方法启动Java Swing应用程序FXDatePickerInSwingExample ,如下所示:

SwingUtilities.invokeLater(() -> {new FXDatePickerInSwingExample().initAndShowGUI();
});

initAndShowGUI()方法显示一个嵌入了JavaFX控件的Swing JFrame 。 以下代码段显示了JFrame构造:

JFrame frame = new JFrame("JavaFX DatePicker in Swing App");
JFXPanel fxPanel = new JFXPanel();
frame.add(fxPanel);
frame.setVisible(true);

javafx.embed.swing.JFXPanel是将JavaFX内容嵌入到Swing应用程序中的组件,并提供JavaFX和Swing的互操作性。 JFXPanel扩展了javax.swing.JComponent 。 用JFXPanelsetScene()方法指定要显示的内容,该方法接受javafx.scene.Scene的实例。 在FX应用程序事件分配线程上调用此方法,如下所示:

Platform.runLater(() -> {fxPanel.setScene(createScene());
});

应用程序的createScene()方法返回带有FX控件的Scene实例。 上面显示的屏幕快照具有完整的GUI。 以下代码段显示了带代码片段的createScene()方法:

private Scene createScene() {GridPane grid = new GridPane();// TitleLabel title1 = new Label("Enter and check if the input date is");Label title2 = new Label("within the selected date range.");VBox titleVb = new VBox();titleVb.setAlignment(Pos.CENTER);titleVb.getChildren().addAll(title1, title2);// Input date pickerLabel inPickLabel = new Label("Input date:");inPicker = new DatePicker();inPicker.setPromptText(pattern);DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);StringConverter converter = new LocalDateStringConverter(formatter, null);inPicker.setConverter(converter);grid.add(inPickLabel, 0, 0);grid.add(inPicker, 1, 0);// From and to date pickersLabel pickLabel1 = new Label("From date:");fmPicker = new DatePicker(LocalDate.now());fmPicker.setEditable(false);grid.add(pickLabel1, 0, 1);grid.add(fmPicker, 1, 1);...// Button...// Vbox and sceneVBox vbox = new VBox(20);vbox.setPadding(new Insets(15, 15, 15, 15));vbox.getChildren().addAll(titleVb, grid, btnHb);return new Scene(vbox);
}

DatePicker控制

javafx.scene.control.DatePicker控件允许用户以文本形式输入日期或从日历弹出窗口中选择日期。 DatePicker的value属性表示当前选择的LocalDate 。 此属性可以与构造函数一起使用,并且具有方法getValue()setValue()

下面的代码片段构造一个日期选择器对象,并将其值设置为今天的日期: DatePicker picker = new DatePicker(LocalDate.now());

日期验证

这个应用程序中有三个日期选择器。 所有这些都配置为捕获有效日期:

  • 日期值不能大于今天。
  • 起始日期永远不能在起始日期之后。

为了完成这些约束,使用了DatePickerdayCellFactoryProperty 。 可以提供自定义单元工厂,以自定义日期选择器弹出窗口中的各个日单元。 日期选择器具有一种用于设置自定义单元格工厂的方法: setDayCellFactory()

这些API用于创建自定义单元格工厂:日期选择器使用DateCell类在日历月中呈现各个网格单元格。 应用程序可以覆盖DateCellupdate方法来更改每个单元格的属性,例如文本,背景色等。

以下代码段显示了返回自定义dayCellFactory的方法。 请注意,此单一方法返回三个日期选择器的单元格工厂。

private Callback getCustomDateCellFactory(DateParameterType dateParamType) {Callback dayCellFactory = new Callback() {@Overridepublic DateCell call(DatePicker datePicker) {return new DateCell() {@Overridepublic void updateItem(LocalDate select, boolean b) {super.updateItem(select, empty);// Date cannot be after today.// This applies for all the date pickers.if (select.isAfter(LocalDate.now())) {setDisable(true);return;}// From-date cannot be greater than to-date.if ((dateParamType == DateParameterType.FROM_DATE)&&(select.isAfter(toPicker.getValue()))) {setDisable(true);}// To-date cannot be less than from-date,// and cannot be greater than today.if (dateParamType == DateParameterType.TO_DATE) {if ((select.isBefore(fmPicker.getValue())) ||(select.isAfter(LocalDate.now()))) {setDisable(true);}}...};return dayCellFactory;
}

将此自定义dayCellFactory应用于createScene()方法中的日期选择器,如下所示:

inPicker.setDayCellFactory(getCustomDateCellFactory(null));
fmPicker.setDayCellFactory(getCustomDateCellFactory(DateParameterType.FROM_DATE));
toPicker.setDayCellFactory(getCustomDateCellFactory(DateParameterType.TO_DATE));

应用程序的getCustomDateCellFactory()方法返回上面已详细说明的自定义单元工厂。 方法参数DateParameterType enum标识要应用单元格工厂的日期选择器。 例如,“起始日期”选择器需要一个“日期”选择器日期才能获取要禁用的单元。 因此DateParameterType.FROM用于标识代码的相关片段(请参见以下代码段)。

// From-date cannot be greater than to-date.
if ((dateParamType == DateParameterType.FROM_DATE) &&(select.isAfter(toPicker.getValue()))) {setDisable(true);
}

自定义输入日期转换器

默认情况下,日期选择器按照默认转换器的格式显示日期字符串(例如,dd / mm / yyyy)。 通过为DatePickersetConverter()方法提供自定义转换器,可以覆盖此方法。 输入日期选择器使用自定义转换器接受并以不同于默认格式(dd-MMM-yy)的格式显示日期。 以下说明显示了自定义转换器的用法。

在以下示例中,这些API用于创建自定义转换器:

  • javafx.util.StringConverter :此抽象类定义字符串和对象之间的转换行为。
  • javafx.util.converter.LocalDateStringConverter :此类是LocalDate值的StringConverter实现。
  • java.time.format.DateTimeFormatter :这是用于打印和解析日期时间对象的格式化程序。

使用提供的格式化程序和解析器为LocalDate值创建一个StringConverter 。 格式化程序用于使用指定的模式将日期转换为格式化的字符串。 请注意,解析器被指定为null。 该转换器应用于dd-MMM-yy格式的输入DatePicker 。 从弹出窗口中选择日期时,使用转换器将日期显示为dd-MMM-yy格式。

以下代码段显示了转换器的创建和用法:

String pattern = "dd-MMM-yy";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
StringConverter converter = new LocalDateStringConverter(formatter, null);
picker.setConverter(converter);

本地日期

Java.time.LocalDate是ISO- Java.time.LocalDate (当今世界上大多数地方使用的现代民用日历系统)中的日期,例如2007-12-03。 此类中没有存储任何时间或时区信息。 可以使用静态方法LocalDate.of(int year, int month, int dayOfMonth)从年,月和日创建实例。

以下是此应用中使用的API:

  • LocalDate.now()从系统时钟获取默认时区的当前日期。 这是一种静态方法。
  • isAfter(ChronoLocalDate localDate)检查此日期是否在指定的日期之后。 这将检查该日期是否代表另一个日期之后的本地时间轴上的一个点。 LocalDate实现java.time.chrono.ChronoLocalDate接口。
  • isBefore(ChronoLocalDate localDate)检查此日期是否在指定日期之前。
  • isEqual(ChronoLocalDate localDate)检查此日期是否等于指定的日期。

示例中使用以下例程检查输入日期是否在所选日期范围内。 从DatePicker控件获取输入以及从日期中选择的日期。 DatePickergetValue()方法返回LocalDate对象。

private boolean validDate(LocalDate start, LocalDate end, LocalDate input) {if ((input.isEqual(start)) || (input.isEqual(end))) {return true;}else if ((input.isAfter(start)) && (input.isBefore(end))) {return true;}else {return false;}
}

3.警报

这是指向描述此示例中使用的javafx.scene.control.Alert对话框的文章的链接 。

4.用法示例

Java Swing没有日期选择器组件。 使用此示例中显示的技术,Swing应用程序可以在Swing JFrame窗口中使用FX的DatePicker控件。 例如,此JFrame可以是“按日期搜索”功能对话框窗口,在其中可以选择日期范围,并且可以按输入日期(例如发票的集合)在所选日期范围内的日期来搜索输入数据。

当用户单击“按日期搜索” JButton时,Swing应用程序的窗口可以作为非模式窗口打开此JFrame对话框(按钮ActionListeneractionPerformed()方法创建此“按日期搜索”对话框的实例)。

5.下载源代码

这是JavaFX 8 DatePicker in Swing ApplicationJavaFX 8 DatePicker in Swing Application的示例

下载
您可以在此处下载此示例的完整源代码: FXDatePickerInSwingExample.zip

*

翻译自: https://www.javacodegeeks.com/2016/05/javafx-8-datepicker-swing-application.html

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

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

相关文章

Apache Bench安装与使用

转载:ApacheBench(ab)使用详解 一、Apache Bench简介 ApacheBench 是 Apache 服务器自带的一个web压力测试工具,简称ab。ab又是一个命令行工具,对发起负载的本机要求很低,根据ab命令可以创建很多的并发访问…

轻松搭建一个Windows SVN服务器

轻松搭建一个Windows SVN服务器 前文所述SVN客户端使用的时候,用的SVN服务器通常为外部,例如Google Code的服务器,不过,做为一个程序开发人员,就算自己一个人写程序,也应该有一个SVN版本控制系统&#xff0…

Spring框架中的内容协商

1.简介 使用BeanNameViewResolver完成的工作就是,我们刚刚在Spring上下文中创建了多个bean视图以生成预期的输出。 Spring很快引入了内容协商策略 ,该策略可以使用传统的RESTful ResponseBody方法和HTTP消息转换器,以JSON或XML返回所需的输出…

logging配置

settings.py # Django的日志配置项BASE_LOG_DIR os.path.join(BASE_DIR, "log")LOGGING {version: 1, # 保留字disable_existing_loggers: False, # 禁用已经存在的logger实例# 日志文件的格式formatters: {# 详细的日志格式standard: {format: [%(asctime)s][%(…

Protobuf学习笔记

Protobuf学习笔记 Posted by iamxhuon 2012/05/22 Leave a comment (0)Go to commentsProtocol buffers是什么? 首先了解一下Protocol Buffers(简称ProtoBuf)是什么?官网对它的定义如下: Protocol buffers are Google’s language-neutral, …

Tortoise SVN 版本控制常用操作知识

Tortoise SVN 版本控制常用操作知识 Posted on 2010-11-26 23:07 szh114 阅读(5897) 评论(0) 编辑 收藏 今天老大跑过来问我如何把SVN服务器上的当前版本回退到某一个版本上去,我没回答上来,很失败,所以现在整理一下Tortoise SVN的操作知识&…

如何导入任何JBoss BRMS示例项目

在过去几周内,JBoss BRMS演示的用户反复询问我以下内容时,会给您这些提示和技巧: “如何将与各种JBoss BRMS演示项目相关的项目导入到我自己的现有安装中?” 这意味着用户希望在产品的个人安装中有一个示例项目,而无…

2110: 扫雷

http://acm.zcmu.edu.cn/JudgeOnline/problem.php?id2110 2110: 扫雷 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 88 Solved: 36[Submit][Status][Web Board]Description 扫雷游戏你一定玩过吧!现在给你若干个nm的地雷阵,请你计算出每个矩阵中每…

青椒苗

转载于:https://www.cnblogs.com/wainiwann/p/8793418.html

如何开始Java机器学习

什么是开始使用Java机器学习的最佳工具? 他们已经存在了一段时间,但如今看来,每个人都在谈论人工智能和机器学习。 对于科学家和研究人员而言,它已不再是秘密,几乎可以在任何新兴技术中实现。 在下面的文章中&#x…

ztree树

常规的ztree树 后台数据封装成list对象 public PageModel getTreeBuildingRegData(Map<String, String> params) {PageModel pageModelnew PageModel();String statusparams.get("status");String orgIdparams.get("org_id");List<OmsBuildingReg…

如何提高效率

如何提高效率 时间管理 April 28th, 2011 本文来自读者 桃雨 翻译投稿。 Aaron Swartz写过一篇很有名的文章&#xff0c;叫做《HOWTO: Be more productive》&#xff08;如何提高效率&#xff09;。这篇文章写的实在是太好了&#xff0c;我看了好多遍&#xff0c;很赞同作者的…

Andrew Ng - 深度学习工程师 - Part 2. 改善深层神经网络:超参数调试、正则化以及优化(Week 1. 机器学习的实用层面)...

第1周 机器学习的实用层面 1.1 训练/开发/测试 早期机器学习时代&#xff08;数据规模较小&#xff09;&#xff0c;如果不需要dev set&#xff0c;常见的划分有 70%/30% 的训练/测试 划分&#xff0c;如果需要验证集&#xff0c;常见的是 60%/20%/20%划分 在big data era&…

jms 如何测试_使用JMSTester对JMS层进行基准测试

jms 如何测试对于我去过的大多数客户端&#xff0c;使用ActiveMQ扩展JMS消息传递层是一个优先事项。 有多种方法可以实现这一目标&#xff0c;但毫无疑问&#xff0c;创建基准并分析实际硬件上的体系结构&#xff08;或者正如我的同事Gary Tully所说的“询问机器”&#xff09;…

为什么待办事项清单不管用

为什么待办事项清单不管用 时间管理 November 22nd, 2012 本文原文来自 Harvard Business Review&#xff0c;由 换装迷宫tayy 翻译。 停止制作你的待办事项清单吧。它们只会让你感觉失败和受挫。想想你正在管理的那些待办清单&#xff1a;有多少事项从年初起就已经在那儿了&…

charts 画饼图

统计某一天某类物体的百分比 新知识点&#xff1a;aggregate https://blog.csdn.net/congcong68/article/details/51619882 主要的 $group $match $sort $limit pipeline [{$group:{_id:$area,count:{$sum:1}}}, # count 是聚合之后新增的一个字段。{$sort:{count:1}}, # …

Apache Camel 2.18 –即将推出的功能的亮点

骆驼骑士正在忙于即将发布的Apache Camel 2.18版本。 当我们动态更新发行说明时 &#xff0c;这是一种快速查看即将发生的情况的方法。 我只是想在夏天在这里进行快速更新&#xff0c;到目前为止&#xff0c;我们已经完成了简短的重点介绍。 随着发行版的临近和文档的完善&…

实时多线程系统的日志实现

实时多线程系统的日志实现 2008-03-21 09:19 黄明/戴颖  软件世界 我要评论(0) 字号&#xff1a;T | T为了分析软件系统在测试和运行期产生的故障&#xff0c;目前大多数软件系统所广泛使用的一种方法就是日志记录。本文给出了利用循环缓冲区和单独的日志读写线程实现实时系统…

Java中获取当前函数名

Java中获取当前函数名 博客分类&#xff1a; Java JavathreadJDKIDEA 有时候我们需要在程序中获取当前运行的函数名&#xff0c;如何简单的做到这点呢&#xff1f;我们可以用getStackTrace轻松搞定。 一提到getStatckTrace多数人会联想到Thowable中的getStackTrace方法。的确&…

建站手册-网站主机:电子商务主机

ylbtech-建站手册-网站主机&#xff1a;电子商务主机1.返回顶部 1、http://www.w3school.com.cn/hosting/host_ecommerce.asp2、2.返回顶部1、如果您的公司正在销售某种产品或服务&#xff0c;那么电子商务也许是做生意的一种好办法。 Internet 商业 电子商务就是在 Internet 上…