javafx swing

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控件

带有日历弹出的FX DatePicker

源代码

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

2.应用说明

Java Swing应用程序FXDatePickerInSwingExample是通过事件分发线程中的Java SE程序的main()方法启动的,如下所示:

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

javafx swing

javafx swing_Swing应用程序中的JavaFX 8 DatePicker相关推荐

  1. Swing应用程序中的JavaFX 8 DatePicker

    1.概述 本文显示了一个使用JavaFX 8 DatePicker控件的Java SE 8 Swing应用程序的示例. DatePicker控件允许用户以文本形式输入日期或从日历弹出窗口中选择日期. ...

  2. javafx 浏览器_浏览器中的JavaFX

    javafx 浏览器 浏览器中的JavaFX屏幕截图 最近,Carl Dea和我启动了一个新项目,将JavaFX 8引入浏览器. 今天,我想介绍我们创建的前两个概念验证,以查看该想法是否完全可行. 对 ...

  3. 在JavaFX程序中嵌入Swing内容

    转载自  在JavaFX程序中嵌入Swing内容 本教程描述如何在JavaFX应用程序中嵌入Swing组件.本文将讨论线程限制并提供一个可运行的应用程序来说明在JavaFX应用程序中嵌入带HTML内容 ...

  4. 在Swing和Swt中使用JavaFX

    转载自  在Swing和Swt中使用JavaFX 本人从08年12月份,JavaFX发布第一个版本开始关注它的发展. 算算到现在,也差不多是第五个年头了.期间经历了一些动荡,但JavaFX还是坚持着发 ...

  5. JavaFX官方教程(三)之JavaFX示例应用程序入门

    翻译自   JavaFX示例应用程序入门 此示例应用程序集旨在帮助您开始使用常见的JavaFX任务,包括使用布局,控件,样式表,FXML和视觉效果. Hello World,JavaFX Style ...

  6. JavaFX实际应用程序:SkedPal

    "真实世界的应用程序"系列中的一个新条目. 这次是SkedPal ,这是一个用于智能管理忙人生活的应用程序. 我一直在咨询SkedPal团队有关JavaFX的事宜,并且在他们决定开 ...

  7. javafx性能_对JavaFX Mobile应用程序进行性能分析

    javafx性能 注意:本文最初发表于2009年,仅供参考. 请查阅我们其余的JavaFX文章 . 对于每个JavaFX Mobile应用程序开发人员而言,今天都是美好的一天. 你想知道为什么吗? 因 ...

  8. JavaFX真实世界应用程序:EIZO CuratOR Caliop

    JavaFX Real-World应用程序第四号称为Caliop . 它是EIZO为医院手术室开发的CuratOR解决方案的前端. 前端在壁挂式控制台上运行,并允许操作团队查找有关患者的信息,控制各种 ...

  9. JavaFX实际应用程序:AISO HRC-Matic

    " Real-World JavaFX Apps"系列中的第三个应用程序是一种重型数据输入应用程序,由称为HRC-Matic的关系数据库支持. 它是由AISO在日内瓦开发的. AI ...

最新文章

  1. pandas使用transpose函数对dataframe进行转置、将dataframe的行和列进行互换(flip the rows and columns in dataframe)
  2. Linux 基金会透露未来 Linux 内核可能会引入形式验证
  3. MATLAB2013a的license过期的解决办法
  4. python break -else 语句
  5. e 签宝携手神策数据,数据赋能智能办公产品服务双升级
  6. JavaScript 模块化七日谈
  7. 使用ADF绑定创建视图对象行CreateInsert操作
  8. iframe框架页面实现自适应高度解决方案
  9. CreateThread、_beginthread与AfxBeginThread的区别及其注意事项
  10. Javascript--闭包引起的IE内存泄露(转载)
  11. jsp 设置404页面
  12. maven仓库中心mirrors配置多个下载中心(执行最快的镜像)
  13. linux字符串处理命令,linux 命令之 字符串处理命令——paste
  14. bigdecimal 怎么做除法_面向对象之BigDecimal
  15. VSCode摸鱼插件,让工作更轻松
  16. 用于视觉问答的相互注意融合模型《Reciprocal Attention Fusion for Visual Question Answering》
  17. 网易云到“网抑云”:分析用户运营的指标监控和召回机制
  18. 低功率、运动传感器 PYQ 1548/7659 特性及应用
  19. matlab实现降低图片的分辨率
  20. 数据时代的我们,应该怎么挖掘数据价值

热门文章

  1. 染色(树链剖分 洛谷-P2486)
  2. YbtOJ#20063-[NOIP2020模拟赛B组Day4]古老谜题【统计】
  3. jzoj6286,P4442-走格子(Portal)【BFS,SPFA】
  4. 欢乐纪中某A组赛【2019.7.5】
  5. POJ2560-雀斑(Freckles)【图论,并查集,最小生成树,KURUSKAL】
  6. 初一模拟赛(5.4)
  7. Java JVM总结
  8. select count(*)底层究竟干了啥么?
  9. URL的getFile()和getPath()方法的区别
  10. 漫画:什么是ConcurrentHashMap