JavaFXでカレンダーを表示・書式設定・日付を選択不可にする方法について記載します。
目次
カレンダー(DatePicker)の使用方法
1. カレンダーを表示する
カレンダーを表示するには、DatePickerクラスを使用します。
構文
DatePicker datePicker = new DatePicker();
実行例

| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35  | 
						import javafx.application.Application; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.DatePicker; import javafx.scene.layout.HBox; import javafx.stage.Stage; public class SampleDatePicker1 extends Application {     @Override     public void start(Stage pStage) throws Exception {         // DatePicker         DatePicker datePicker = new DatePicker();         // 配置         HBox hbRoot = new HBox();         hbRoot.setAlignment(Pos.CENTER);         hbRoot.setSpacing(10);         hbRoot.getChildren().addAll( datePicker );         pStage.setTitle("DatePicker");         pStage.setWidth(300);         pStage.setHeight(200);         pStage.setScene(new Scene(hbRoot));         pStage.show();     }     public static void main(String[] args){         Application.launch(args);     } }  | 
					
2. 初期値を設定
初期値を設定するには、DatePickerのコンストラクタで指定、もしくはsetValueメソッドで指定します。
構文( コンストラクタ )
DatePicker datePicker = new DatePicker(LocalDate.of(2022, 6, 1));
構文( setValue )
DatePicker datePicker = new DatePicker();
datePicker.setValue(LocalDate.of(2022, 6, 1));
datePicker.setValue(LocalDate.of(2022, 6, 1));
実行例

3. 日付書式を設定
日付書式を設定するには、StringConverterクラスを継承したクラスを作成します。
次の例では、yyyy年MM月dd日 とフォーマットを設定しています。
実行例

| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72  | 
						import java.time.LocalDate; import java.time.format.DateTimeFormatter; import javafx.application.Application; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.DatePicker; import javafx.scene.layout.HBox; import javafx.stage.Stage; import javafx.util.StringConverter; public class SampleDatePicker2 extends Application {     @Override     public void start(Stage pStage) throws Exception {         // DatePicker         DatePicker datePicker = new DatePicker(LocalDate.of(2022, 6, 1));         // 日付書式を設定         StringConverter<LocalDate> dateConverter =  new DateFormatConverter("yyyy年MM月dd日");         datePicker.setConverter(dateConverter);         // 配置         HBox hbRoot = new HBox();         hbRoot.setAlignment(Pos.CENTER);         hbRoot.setSpacing(10);         hbRoot.getChildren().addAll( datePicker );         pStage.setTitle("日付ピッカー");         pStage.setWidth(300);         pStage.setHeight(200);         pStage.setScene(new Scene(hbRoot));         pStage.show();     }     public static void main(String[] args){         Application.launch(args);     } } /**  * 日付書式を設定  */ class DateFormatConverter extends StringConverter<LocalDate> {     DateTimeFormatter dateFormatter = null;     public DateFormatConverter( final String pattern ) {         dateFormatter = DateTimeFormatter.ofPattern(pattern);     }     @Override     public String toString(LocalDate date) {         if (date != null) {             return dateFormatter.format(date);         } else {             return "";         }     }     @Override     public LocalDate fromString(String string) {         if (string != null && !string.isEmpty()) {             return LocalDate.parse(string, dateFormatter);         } else {             return null;         }     } }  | 
					
4. 指定した日付を選択不可にする
指定した日付のセルを操作するには、DayCellFactory を使用します。
次の実行例では、今日より前の日付を選択不可にします。
実行例

| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63  | 
						import java.time.LocalDate; import javafx.application.Application; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.DateCell; import javafx.scene.control.DatePicker; import javafx.scene.layout.HBox; import javafx.stage.Stage; import javafx.util.Callback; public class SampleDatePicker3 extends Application {     // DatePicke     DatePicker datePicker = new DatePicker( LocalDate.now() );     @Override     public void start(Stage pStage) throws Exception {         // DayCellFactoryを設定         datePicker.setDayCellFactory( new DayCellFactory() );         // 配置         HBox hbRoot = new HBox();         hbRoot.setAlignment(Pos.CENTER);         hbRoot.setSpacing(10);         hbRoot.getChildren().addAll( datePicker );         pStage.setTitle("日付ピッカー");         pStage.setWidth(300);         pStage.setHeight(200);         pStage.setScene(new Scene(hbRoot));         pStage.show();     }     /**      * 日付セルを個別に操作する      */     class DayCellFactory implements Callback<DatePicker, DateCell> {         @Override         public DateCell call(DatePicker param) {             return new DateCell() {                 @Override                 public void updateItem(LocalDate item, boolean empty) {                     super.updateItem(item, empty);                     // 今日より前のセルは選択不可、セルの色を変える。                     if( item.isBefore( datePicker.getValue() ) ) {                       setDisable(true);                       setStyle("-fx-background-color: #eee;");                     }                 }             };         }     }     public static void main(String[] args){         Application.launch(args);     } }  |