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的日歷彈出窗口的應用程序。
Swing JFrame中的FX控件
帶有日歷彈出的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 。 用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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jenkins api_接触Jenkin
- 下一篇: 电脑系统放大镜(电脑上的放大镜)