gpt4 book ai didi

javafx - javaFx是否有可用的日期和时间选择器?

转载 作者:行者123 更新时间:2023-12-03 23:23:05 27 4
gpt4 key购买 nike

我是Java的新手,我已经开始使用javaFx在Java中开发应用程序。搜索了很多内容,但是在javaFx中找不到任何日期和时间选择器。即使我尝试了JFxtras,但它也不起作用。顺便说一句,我正在使用javafx 2.2.3和java7。任何帮助将不胜感激。

最佳答案

这是上面的DateTimePicker控件的Java版本,略有改进。

该代码现在是TornadoFX Controls的一部分,您可以在GitHub Repo中查看DateTimePicker.java的最新版本。在这些坐标下,Maven Central中也可以使用该控件:

<dependency>
<groupId>no.tornado</groupId>
<artifactId>tornadofx-controls</artifactId>
<version>1.0.3</version>
</dependency>


现在的实现:

import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.scene.control.DatePicker;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.util.StringConverter;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

/**
* A DateTimePicker with configurable datetime format where both date and time can be changed
* via the text field and the date can additionally be changed via the JavaFX default date picker.
*/
@SuppressWarnings("unused")
public class DateTimePicker extends DatePicker {
public static final String DefaultFormat = "yyyy-MM-dd HH:mm";

private DateTimeFormatter formatter;
private ObjectProperty<LocalDateTime> dateTimeValue = new SimpleObjectProperty<>(LocalDateTime.now());
private ObjectProperty<String> format = new SimpleObjectProperty<String>() {
public void set(String newValue) {
super.set(newValue);
formatter = DateTimeFormatter.ofPattern(newValue);
}
};

public DateTimePicker() {
getStyleClass().add("datetime-picker");
setFormat(DefaultFormat);
setConverter(new InternalConverter());

// Syncronize changes to the underlying date value back to the dateTimeValue
valueProperty().addListener((observable, oldValue, newValue) -> {
if (newValue == null) {
dateTimeValue.set(null);
} else {
if (dateTimeValue.get() == null) {
dateTimeValue.set(LocalDateTime.of(newValue, LocalTime.now()));
} else {
LocalTime time = dateTimeValue.get().toLocalTime();
dateTimeValue.set(LocalDateTime.of(newValue, time));
}
}
});

// Syncronize changes to dateTimeValue back to the underlying date value
dateTimeValue.addListener((observable, oldValue, newValue) -> {
setValue(newValue == null ? null : newValue.toLocalDate());
});

// Persist changes onblur
getEditor().focusedProperty().addListener((observable, oldValue, newValue) -> {
if (!newValue)
simulateEnterPressed();
});

}

private void simulateEnterPressed() {
getEditor().fireEvent(new KeyEvent(getEditor(), getEditor(), KeyEvent.KEY_PRESSED, null, null, KeyCode.ENTER, false, false, false, false));
}

public LocalDateTime getDateTimeValue() {
return dateTimeValue.get();
}

public void setDateTimeValue(LocalDateTime dateTimeValue) {
this.dateTimeValue.set(dateTimeValue);
}

public ObjectProperty<LocalDateTime> dateTimeValueProperty() {
return dateTimeValue;
}

public String getFormat() {
return format.get();
}

public ObjectProperty<String> formatProperty() {
return format;
}

public void setFormat(String format) {
this.format.set(format);
}

class InternalConverter extends StringConverter<LocalDate> {
public String toString(LocalDate object) {
LocalDateTime value = getDateTimeValue();
return (value != null) ? value.format(formatter) : "";
}

public LocalDate fromString(String value) {
if (value == null) {
dateTimeValue.set(null);
return null;
}

dateTimeValue.set(LocalDateTime.parse(value, formatter));
return dateTimeValue.get().toLocalDate();
}
}
}


dateTimeValue属性包含带有时间的值,而 valueProperty仅包含日期值。

我尚未为此组件添加测试,因此实现可能会发生变化,请查看GitHub以获取最新版本。

关于javafx - javaFx是否有可用的日期和时间选择器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28493097/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com