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控件(带有Label
, DatePicker
和Button
FXPanel
)和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
。 用JFXPanel
的setScene()
方法指定要显示的内容,该方法接受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());
日期验证
这个应用程序中有三个日期选择器。 所有这些都配置为捕获有效日期:
- 日期值不能大于今天。
- 起始日期永远不能在起始日期之后。
为了完成这些约束,使用了DatePicker
的dayCellFactoryProperty
。 可以提供自定义单元工厂,以自定义日期选择器弹出窗口中的各个日单元。 日期选择器具有一种用于设置自定义单元格工厂的方法: setDayCellFactory()
。
这些API用于创建自定义单元格工厂:日期选择器使用DateCell
类在日历月中呈现各个网格单元格。 应用程序可以覆盖DateCell
的update
方法来更改每个单元格的属性,例如文本,背景色等。
以下代码段显示了返回自定义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)。 通过为DatePicker
的setConverter()
方法提供自定义转换器,可以覆盖此方法。 输入日期选择器使用自定义转换器接受并以不同于默认格式(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
控件获取输入以及从日期中选择的日期。 DatePicker
的getValue()
方法返回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
对话框(按钮ActionListener
的actionPerformed()
方法创建此“按日期搜索”对话框的实例)。
5.下载源代码
这是JavaFX 8 DatePicker in Swing Application
中JavaFX 8 DatePicker in Swing Application
的示例
您可以在此处下载此示例的完整源代码: FXDatePickerInSwingExample.zip
*
翻译自: https://www.javacodegeeks.com/2016/05/javafx-8-datepicker-swing-application.html
Swing应用程序中的JavaFX 8 DatePicker相关推荐
- javafx swing_Swing应用程序中的JavaFX 8 DatePicker
javafx swing 1.概述 本文显示了一个使用JavaFX 8 DatePicker控件的Java SE 8 Swing应用程序的示例. DatePicker控件允许用户以文本形式输入日期或从 ...
- 在Swing和Swt中使用JavaFX
转载自 在Swing和Swt中使用JavaFX 本人从08年12月份,JavaFX发布第一个版本开始关注它的发展. 算算到现在,也差不多是第五个年头了.期间经历了一些动荡,但JavaFX还是坚持着发 ...
- java swing暂停继续_如何在Java Swing应用程序中暂停/睡眠/等待?
小编典典 Thread#sleep在 主 线程中的swing应用程序中使用method 会导致GUI冻结(因为该线程处于睡眠状态,因此无法发生事件).Thread#sleepSwing应用程序中的Sw ...
- Swing应用程序中的CDI事件可将UI与事件处理分离
在享受了几年围绕CDI构建我的代码的乐趣之后,使用它根据众所周知的模式来构造我的代码非常自然. CDI是一种旨在在Java EE应用程序服务器中使用的依赖项注入机制,这可能被视为不利. 但是,我想证明 ...
- java swing 帮助文档,在Java Swing应用程序中创建在线帮助-使用pdf用户文档
我正在尝试将一些用户文档链接到我的Java Swing应用程序.用户文档是pdf,我希望能够在应用程序中单击一个按钮,该按钮会打开某种pdf渲染器以显示我的userdoc.pdf. 我不想使用运行时e ...
- java能不能播放mp4_如何在Java Swing应用程序中播放MP4视频
感谢@VGR引起了我对JavaFX的关注,我将JFXPanel集成到了我想要视频放置的JPanel中.就我而言,它工作得很好,因为它是一个可以播放一个视频的简单屏幕. 以下是完整的代码段: priva ...
- keyboard类在Java中的作用_keyboard – 死键在Java Swing应用程序中不起作用
我目前正在使用Ubuntu 10.10和Netbeans 7.0,我不能再用死键键入重音字母了.它不是特定于版本的问题似乎与Swing有关,因为我对旧版本的Netbeans和操作系统有同样的问题. 当 ...
- java调用jce加密_关于加密:JCE无法在java swing应用程序中验证提供程序BC
我在JAVA中创建了一个基于swing的应用程序,它使用了一些加密技术. 但 javax.crypto.KeyGenerator.getInstance("AES","B ...
- java 中 webcam类_如何在Java的Swing应用程序中集成Webcam?
>下载并安装 JMF >将jmf.jar添加到项目库中 >下载 FrameGrabber源文件并将其添加到项目中 >按如下方式使用它开始捕获视频. 新的FrameGrabber ...
最新文章
- Python实战案例,pyecharts模块,Python实现5G数据
- HTML特殊转义字符列表
- 笔记本打字不知道按了什么键,打字老出现数字?
- javascript案例练习
- golang导入包的几个说明:import
- DocumentHelper和SAXReader解析XML字符串
- Android内存泄漏问题(一)
- 阿里巴巴王坚:用数据来改变世界
- 鸿蒙电脑操作系统最新消息,5G专家预测:7年后鸿蒙将成全球第一大操作系统
- 2017.10.11 Problem c 失败总结
- 巧用SQL的全局临时表防止用户重复登录
- 注入器 过检测_福特全顺V348检测车报价
- React技术栈梳理
- Python学习笔记(六)——查询天气脚本
- MTK 驱动 Kernel-3.18中如何配置和使用spi
- [转]魔兽世界私服Trinity,从源码开始
- FileZilla Server超详细配置
- vmware fusion8 序列号
- java treemap的排序_Java TreeMap的排序(转)
- Linux arm 下载程序,在Linux下使用kermit和dnw给ARM板下载程序
热门文章
- 阿里巴巴对Java编程【应用结构】的规约
- 既然参与,那就做好,我相信我们是最棒的!!!
- javaWeb服务详解(含源代码,测试通过,注释) ——web.xml
- 利用redis保存验证码并设置过期时间
- 投票源码程序_[内附完整源码和文档] 基于JSP实现的影视创作论坛系统
- python内置模块有哪些_python中那些小众但有用的内置模块
- python调用webservice接口实例_python调用webservice接口的实现
- linux-basic(8)linux磁盘与文件系统管理
- 不同特权级间代码段的跳转{ 门 + 跳转(jmp + call) + 返回(ret) }
- Spring Batch –用JavaConfig替换XML作业配置