且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2023-02-26 18:12:57

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



此代码现在是 TornadoFX Controls ,您可以查看最新版本的 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;

/ **
*具有可配置日期时间格式的DateTimePicker,可以通过文本字段更改日期和时间
*,并且可以通过JavaFX默认值更改日期日期选择器
* /
@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());

//将基础日期值的更改同步到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) );
}
}
});

//同步更改dateTimeValue回到基础日期值
dateTimeValue.addListener((observable,oldValue,newValue) - > {
setValue(newValue == null? null:newValue.toLocalDate());
});

//持久变化onblur
getEditor()。focusProperty()。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(){
返回格式;
}

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);
返回null;
}

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

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



我尚未添加此组件的测试,因此实施可能会更改,请检查GitHub的最新版本。


I am new to Java and I have started developing applications in java using javaFx. searched a lot but couldn't find any date and time picker in javaFx. Even i tried JFxtras but its not working. By the way i am using javafx 2.2.3 and java 7. Any help would be highly appreciated.

Here is a Java version of the DateTimePicker control above, slightly improved.

This code is now part of TornadoFX Controls and you can have a look at the latest version of DateTimePicker.java in the GitHub Repo. The control is available in Maven Central as well under these coordinates:

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

The implementation right now:

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

The dateTimeValue property contains the value with time, and the valueProperty contains only the date value.

I have not added tests for this component yet, so the implementation might change, check GitHub for the latest version.