javafx swing_Swing应用程序中的JavaFX 8 DatePicker
javafx swing
1.概述
本文顯示了一個(gè)使用JavaFX 8 DatePicker控件的Java SE 8 Swing應(yīng)用程序的示例。
DatePicker控件允許用戶以文本形式輸入日期或從日歷彈出窗口中選擇日期。 本示例使用其中帶有FX控件的Swing JFrame 。 為了將FX內(nèi)容嵌入Swing應(yīng)用程序中, javafx.embed.swing包提供了JFXPanel類。
該應(yīng)用程序從日期選擇器中獲取一個(gè)輸入日期,并檢查它是否在用戶選擇的兩個(gè)日期選擇器中的日期范圍內(nèi)(從日期到日期)。 日期選擇器的日期驗(yàn)證包括:
- 起始日期小于起始日期
 - 日期不是將來的日期
 - 輸入日期在開始和結(jié)束日期(包括)之內(nèi)
 
無效或有效消息顯示在“ FX Alert對(duì)話框中。
以下兩個(gè)屏幕截圖顯示了具有JFrame以及嵌入式FX控件(帶有Label , DatePicker和Button FXPanel )和DatePicker的日歷彈出窗口的應(yīng)用程序。
Swing JFrame中的FX控件
帶有日歷彈出的FX DatePicker
源代碼
可從本文末尾提供的鏈接下載此示例FXDatePickerInSwingExample.java的源代碼。 請(qǐng)注意,編譯和運(yùn)行代碼需要Java SE 8。 Java SE 8包含JavaFX 8。
2.應(yīng)用說明
Java Swing應(yīng)用程序FXDatePickerInSwingExample是通過事件分發(fā)線程中的Java SE程序的main()方法啟動(dòng)的,如下所示:
SwingUtilities.invokeLater(() -> {new FXDatePickerInSwingExample().initAndShowGUI(); });initAndShowGUI()方法顯示一個(gè)嵌入了JavaFX控件的Swing JFrame 。 以下代碼段顯示了JFrame構(gòu)造:
JFrame frame = new JFrame("JavaFX DatePicker in Swing App"); JFXPanel fxPanel = new JFXPanel(); frame.add(fxPanel); frame.setVisible(true);javafx.embed.swing.JFXPanel是將JavaFX內(nèi)容嵌入到Swing應(yīng)用程序中的組件,并提供JavaFX和Swing的互操作性。 JFXPanel擴(kuò)展了javax.swing.JComponent 。 用JFXPanel的setScene()方法指定要顯示的內(nèi)容,該方法接受javafx.scene.Scene的實(shí)例。 在FX應(yīng)用程序事件分配線程上調(diào)用此方法,如下所示:
Platform.runLater(() -> {fxPanel.setScene(createScene()); });應(yīng)用程序的createScene()方法返回帶有FX控件的Scene實(shí)例。 上面顯示的屏幕快照具有完整的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屬性表示當(dāng)前選擇的LocalDate 。 此屬性可與構(gòu)造函數(shù)一起使用,并且具有方法getValue()和setValue() 。
下面的代碼片段構(gòu)造一個(gè)日期選擇器對(duì)象,并將其值設(shè)置為今天的日期: DatePicker picker = new DatePicker(LocalDate.now());
日期驗(yàn)證
這個(gè)應(yīng)用程序中有三個(gè)日期選擇器。 所有這些都配置為捕獲有效日期:
- 日期值不能大于今天。
 - 起始日期永遠(yuǎn)不能在起始日期之后。
 
為了完成這些約束,使用了DatePicker的dayCellFactoryProperty 。 可以提供自定義單元工廠,以自定義日期選擇器彈出窗口中的各個(gè)日單元。 日期選擇器具有一種用于設(shè)置自定義單元格工廠的方法: setDayCellFactory() 。
這些API用于創(chuàng)建自定義單元格工廠:日期選擇器使用DateCell類在日歷月中呈現(xiàn)各個(gè)網(wǎng)格單元格。 應(yīng)用程序可以覆蓋DateCell的update方法來更改每個(gè)單元格的屬性,例如文本,背景色等。
以下代碼段顯示了返回自定義dayCellFactory的方法。 請(qǐng)注意,此單一方法返回三個(gè)日期選擇器的單元格工廠。
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應(yīng)用于createScene()方法中的日期選擇器,如下所示:
inPicker.setDayCellFactory(getCustomDateCellFactory(null)); fmPicker.setDayCellFactory(getCustomDateCellFactory(DateParameterType.FROM_DATE)); toPicker.setDayCellFactory(getCustomDateCellFactory(DateParameterType.TO_DATE));應(yīng)用程序的getCustomDateCellFactory()方法返回上面已詳細(xì)說明的自定義單元工廠。 方法參數(shù)DateParameterType enum標(biāo)識(shí)要應(yīng)用單元格工廠的日期選擇器。 例如,“起始日期”選擇器需要一個(gè)“日期”選擇器日期才能獲取要禁用的單元。 因此DateParameterType.FROM用于標(biāo)識(shí)代碼的相關(guān)片段(請(qǐng)參見以下代碼段)。
// From-date cannot be greater than to-date. if ((dateParamType == DateParameterType.FROM_DATE) &&(select.isAfter(toPicker.getValue()))) {setDisable(true); }自定義輸入日期轉(zhuǎn)換器
默認(rèn)情況下,日期選擇器按照默認(rèn)轉(zhuǎn)換器的格式顯示日期字符串(例如,dd / mm / yyyy)。 通過為DatePicker的setConverter()方法提供自定義轉(zhuǎn)換器,可以覆蓋此方法。 輸入日期選擇器使用自定義轉(zhuǎn)換器接受并以不同于默認(rèn)格式(dd-MMM-yy)的格式顯示日期。 以下說明顯示了自定義轉(zhuǎn)換器的用法。
在以下示例中,這些API用于創(chuàng)建自定義轉(zhuǎn)換器:
- javafx.util.StringConverter :此抽象類定義字符串和對(duì)象之間的轉(zhuǎn)換行為。
 - javafx.util.converter.LocalDateStringConverter :此類是LocalDate值的StringConverter實(shí)現(xiàn)。
 - java.time.format.DateTimeFormatter :這是用于打印和解析日期時(shí)間對(duì)象的格式化程序。
 
使用提供的格式化程序和解析器為L(zhǎng)ocalDate值創(chuàng)建一個(gè)StringConverter 。 格式化程序用于使用指定的模式將日期轉(zhuǎn)換為格式化的字符串。 請(qǐng)注意,解析器被指定為null。 該轉(zhuǎn)換器應(yīng)用于dd-MMM-yy格式的輸入DatePicker 。 從彈出窗口中選擇日期時(shí),使用轉(zhuǎn)換器將日期顯示為dd-MMM-yy格式。
以下代碼段顯示了轉(zhuǎn)換器的創(chuàng)建和使用:
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 (當(dāng)今世界上大多數(shù)地方使用的現(xiàn)代民用日歷系統(tǒng))中的日期,例如2007-12-03。 此類中沒有存儲(chǔ)任何時(shí)間或時(shí)區(qū)信息。 可以使用靜態(tài)方法LocalDate.of(int year, int month, int dayOfMonth)從年,月和日創(chuàng)建實(shí)例。
以下是此應(yīng)用中使用的API:
- LocalDate.now()從系統(tǒng)時(shí)鐘以默認(rèn)時(shí)區(qū)獲取當(dāng)前日期。 這是一種靜態(tài)方法。
 - isAfter(ChronoLocalDate localDate)檢查此日期是否在指定的日期之后。 這將檢查該日期是否代表另一個(gè)日期之后的本地時(shí)間軸上的一個(gè)點(diǎn)。 LocalDate實(shí)現(xiàn)java.time.chrono.ChronoLocalDate接口。
 - isBefore(ChronoLocalDate localDate)檢查此日期是否在指定日期之前。
 - isEqual(ChronoLocalDate localDate)檢查此日期是否等于指定的日期。
 
示例中使用以下例程檢查輸入日期是否在所選日期范圍內(nèi)。 從DatePicker控件獲取輸入以及從日期中選擇的日期。 DatePicker的getValue()方法返回LocalDate對(duì)象。
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.警報(bào)
這是指向描述此示例中使用的javafx.scene.control.Alert對(duì)話框的文章的鏈接 。
4.用法示例
Java Swing沒有日期選擇器組件。 使用此示例中顯示的技術(shù),Swing應(yīng)用程序可以在Swing JFrame窗口中使用FX的DatePicker控件。 例如,此JFrame可以是“按日期搜索”功能對(duì)話框窗口,在該對(duì)話框中可以選擇日期范圍,并且可以按所選日期范圍內(nèi)的日期搜索輸入數(shù)據(jù)(例如發(fā)票的集合)。
當(dāng)用戶單擊“按日期搜索” JButton時(shí),Swing應(yīng)用程序的窗口可以作為非模式窗口打開此JFrame對(duì)話框(按鈕ActionListener的actionPerformed()方法創(chuàng)建此“按日期搜索”對(duì)話框的實(shí)例)。
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
javafx swing
總結(jié)
以上是生活随笔為你收集整理的javafx swing_Swing应用程序中的JavaFX 8 DatePicker的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: ddos攻击怎么解除(ddos怎么关闭)
 - 下一篇: linux命令vim修改内容怎么退出(l