javafx swing_Swing应用程序中的JavaFX 8 DatePicker

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

Swing JFrame中的FX控件

带有日历弹出的FX DatePicker

带有日历弹出的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

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

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

相关文章

cup过高是什么意思_做青和焙火有什么关系?

武夷岩茶制作工艺复杂,环环相扣,每一步工艺对下一步工艺都有很大的影响,经过一系列的生化变化,最终呈现一杯好茶在我们面前,那我们最关心的做青和焙火两个问题,有什么影响呢?它们之间既有因果关…

【安卓开发 】Android初级开发(四)ListView

ListView的实现步骤 1.单独一行的布局可以如下 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:orientation"horizontal"android:layout_width&…

不能装载文档控件。请在检查浏览器的选项中检查浏览器的安全设置_【网络安全宣传周】网络安全小黑板 | 如何正确设置浏览器...

李夏是一个公司的职员&#xff0c;一天晚上加班赶制文档&#xff0c;由于要向客户汇报产品情况&#xff0c;需要获取大量网上信息&#xff0c;然而在制作中却发现浏览器的网页打不开了。第二天原计划向客户展示的材料未能完整汇总&#xff0c;客户见面对接效果也打了折扣。在当…

vs 不能自动 析构函数_深入理解C++虚函数的override、overload与hide以及虚析构函数...

今天主要讲的是虚函数的override与overload的区别。首先我们来看一段代码&#xff1a;示例代码#include <stdio.h>#include <string>#include <iostream>#include <complex>using namespace std;class Father{public: Father(); ~Father(); virtual vo…

tampermonkey怎么不能用了_普洱茶发霉了怎么办?能不能用太阳晒

大家都知道普洱茶要储藏在通风干燥的地方&#xff0c;如果储存不恰当就可能变质发霉。而且普洱茶很容易吸味&#xff0c;需要存放到干净的环境并避免日晒。当发现茶叶发霉的现象比较严重时&#xff0c;需要直接扔掉。如果不严重&#xff0c;可以采用以下方法&#xff1a;千万不…

vue 动态变量名_【告别复制粘贴】动态模板生成小技巧

? 这是第 75篇不掺水的原创&#xff0c;想要了解更多&#xff0c;请戳上方蓝色字体&#xff1a;政采云前端团队关注我们吧&#xff5e;本文首发于政采云前端团队博客&#xff1a;告别复制粘贴&#xff1a;动态模板生成小技巧https://www.zoo.team/article/dynamic-template-ge…

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

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

amos看拟合度在哪里看_哪里可以看亲爱的热爱的电视剧全集

由杨紫、李现、胡一天、张格出演的暖心甜宠剧《亲爱的&#xff0c;热爱的》正在热播中。该剧根据墨宝非宝小说《蜜汁炖鱿鱼》改编&#xff0c;讲述了一场高智商与高情商的甜萌梦幻爱情故事。剧中李现饰演的高冷G神和杨紫饰演的萌妹学霸&#xff0c;从开头的一见钟情到后面的相处…

jaxb xml配置_JAXB和Log4j XML配置文件

jaxb xml配置Log4j 1.x和Log4j 2.x均支持使用XML文件来指定日志记录配置 。 这篇文章探讨了与使用JAXB通过Java类处理这些XML配置文件相关的一些细微差别。 本文中的示例基于Apache Log4j 1.2.17 &#xff0c; Apache Log4j 2.6.2和Java 1.8.0_73&#xff08;带有JAXB xjc 2.2.…

multiprocessing.queue取数据要加锁么_干货 | 小程序多页面接口数据缓存

小程序里面多个页面&#xff0c;有时候会需要用到同一个接口的数据。而这些数据全局来说只需要拉取一遍&#xff0c;如果要存到缓存&#xff0c;要怎么保证其他页面取缓存的时候&#xff0c;数据已经拉取回来了呢&#xff1f;答案是多页面接口数据缓存实现。思路设计其实这种场…

apache.camel_Apache Camel 2.18 –即将推出的功能的亮点

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

【安卓开发 】Android初级开发(八)WebView网页

1.网页的基本组成 2.WebView的常用方法 WebView webView findViewById(R.id.webvv);//加载线上网页webView.loadUrl("https://www.baidu.com");//加载SD卡上的html文件,Environment.getDownloadCacheDirectory().getPath()为获取SD卡根目录路径webView.loadUrl(&quo…

python整数加法计算器_Python应用实例赏析2.1简单计算

在日常应用中&#xff0c;我们会经常使用计算器进行计算&#xff0c;有些时候普通计算器的功能不能满足需要&#xff0c;例如使用计算机系统自带的计算器&#xff0c;计算不能超过32位数&#xff0c;手机自带计算器不能超过15位等(我的电脑和手机)&#xff0c;也可能计算需要的…

智能雷达物位计说明书_?浅谈人工检尺法和雷达液位计在油罐液位测量中的应用...

近年来&#xff0c;油罐液位的测量工作已成为工业测量中十分重要的部分。过去&#xff0c;在油罐测量方面&#xff0c;人工检尺法是进行液位测量的主要方法之一&#xff0c;但随着科技的发展和进步&#xff0c;雷达液位计等智能化液位测量设备使油罐的监控和测量方式趋向于多元…

【安卓开发 】Android初级开发(九)Android中封装View提供接口供点击事件回调的方法及使用

自古一楼先上图 package com.example.mydialog;import android.app.Dialog; import android.content.Context; import android.os.Bundle; import android.util.DisplayMetrics; import android.view.LayoutInflater; import android.view.View; import android.view.Window; i…

打印pdf就一页_Excel表格打印技巧汇总,看完才发现,你连基础打印技巧都不知道...

前天被老板削了一顿&#xff0c;说我打印的表格连标题行都没有&#xff01;昨天被老板削了两顿&#xff0c;说我打印的表格太浪费纸&#xff01;今天被老板削了五顿&#xff0c;说我表格打印出来的数据居然是错误&#xff01;……在挨削了很多次之后&#xff0c;学会了一些技巧…

机器学习java_如何开始使用Java机器学习

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

nginx delete form表单 收不到参数_HTTP 文件上传的一个后端完善方案(NginX)

(给PHP开发者加星标&#xff0c;提升PHP技能)转自&#xff1a;林伯格https://breeze2.github.io/blog/scheme-nginx-php-js-upload-process前言很多网站都会有上传文件的功能&#xff0c;比如上传用户头像&#xff0c;上传个人简历等等&#xff0c;除非是网盘类的网站&#xff…

高通写号工具_高通推出桌面平台新ARM处理器并认为我们的电脑性能没必要那么高...

高通公司在日前举办的骁龙技术峰会上宣布推出骁龙7c / 8c处理器 , 这些处理器全部都是面向笔记本电脑推出的。这也是高通和微软合作推出 Windows 10 ARM 设备的组成部分 , 高通希望能够在桌面平台挑战英特尔统治地位。如果你有印象的话或许还记得高通此前推出的骁龙 8cx芯片组&…

混合高斯模型_高斯混合模型(GMM)

下图所示&#xff0c;显然用右边的图描述当前分布更加合理&#xff0c;即应用了两个高斯分布。图中每一个样本点同时属于任何一个高斯模型。高斯混合模型 从几何角度来理解&#xff0c;GMM是由多个高斯分布叠加而成&#xff0c;可以看做是多个高斯分布的加权平均。其中&#x…