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); } } |