Я новичок в Java, и я начал разрабатывать приложения в java с помощью javaFx. много искал, но не смог найти дату и время в javaFx. Даже я попробовал JFxtras, но не работал. Кстати, я использую javafx 2.2.3 и java 7. Любая помощь будет высоко оценена.Есть ли возможность выбора даты и времени для javaFx?
ответ
Проект JFXtras имеет рабочую версию для JavaFX 2.2. Ищите CalendarPicker
, CalendarTimePicker
, ... на repo, под ветвью 2.2.
Вы можете проверить его, загрузив последнюю версию (2.2-r6-SNAPSHOT) из jfxtras.org.
Этот короткий фрагмент будет создать календарь для выбора как дата и время:
@Override
public void start(Stage primaryStage) {
CalendarPicker dateTime = new CalendarPicker();
dateTime.withCalendar(Calendar.getInstance());
dateTime.withShowTime(Boolean.TRUE);
dateTime.withLocale(Locale.ENGLISH);
dateTime.calendarProperty().addListener(new ChangeListener<Calendar>() {
@Override
public void changed(ObservableValue<? extends Calendar> ov, Calendar t, Calendar t1) {
System.out.println("Selected date: "+t1.getTime().toString());
}
});
StackPane root = new StackPane();
root.getChildren().add(dateTime);
Scene scene = new Scene(root, 300, 250);
primaryStage.setTitle("Date & Time from JFXtras 2.2");
primaryStage.setScene(scene);
primaryStage.show();
}
Я считаю, что наиболее удобно для ввода времени с помощью клавиатуры, а не менять его с ползунками. Это довольно легко расширить включенную DatePicker выглядеть следующим образом:
Я также считаю, что раздражает, что DatePicker не совершает отредактированное значение в TextField ONBLUR, поэтому следующий код устанавливает, что хорошо ,
Сниппет написано в Котлин для brevety, вы можете легко преобразовать его в Java с помощью IntelliJ IDEA:
import javafx.beans.property.SimpleObjectProperty
import javafx.scene.control.DatePicker
import javafx.scene.input.KeyCode
import javafx.scene.input.KeyEvent
import javafx.scene.input.MouseEvent
import javafx.util.StringConverter
import java.time.LocalDate
import java.time.LocalDateTime
import java.time.LocalTime
import java.time.format.DateTimeFormatter
class DateTimePicker(val formatter: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")) : DatePicker() {
private var dateTimeValue = SimpleObjectProperty<LocalDateTime>(LocalDateTime.now())
init {
converter = object : StringConverter<LocalDate>() {
override fun toString(value: LocalDate?): String {
return if (dateTimeValue.get() != null) dateTimeValue.get().format(formatter) else ""
}
override fun fromString(value: String?): LocalDate? {
if (value == null) {
dateTimeValue.set(null)
return null
}
dateTimeValue.set(LocalDateTime.parse(value, formatter))
return dateTimeValue.get().toLocalDate()
}
}
// Syncronize changes to the underlying date value back to the dateTimeValue
valueProperty().addListener { observable, old, new ->
if (new == null) {
dateTimeValue.set(null)
} else {
if (dateTimeValue.get() == null) {
dateTimeValue.set(LocalDateTime.of(new, LocalTime.now()))
} else {
val time = dateTimeValue.get().toLocalTime()
dateTimeValue.set(LocalDateTime.of(new, time))
}
}
}
// Syncronize changes to dateTimeValue back to the underlying date value
dateTimeValue.addListener { observable, old, new ->
valueProperty().set(new?.toLocalDate())
}
// Persist changes onblur
editor.focusedProperty().addListener { observable, old, new ->
if (!new)
simulateEnterPressed()
}
}
private fun simulateEnterPressed() =
editor.fireEvent(KeyEvent(editor, editor, KeyEvent.KEY_PRESSED, null, null, KeyCode.ENTER, false, false, false, false))
fun dateTimeValueProperty() = dateTimeValue;
}
Bind вашего LocalDateTime собственности на dateTimeValueProperty.
Вы могли бы предоставить это как java-код? (его вопрос java, и intelliJ не является бесплатным) – lumo
Несомненно, я преобразую его в Java-код и отправлю его здесь. Однако IntelliJ Community Edition совершенно свободен. –
Вот приведенная выше версия Java DateTimePicker, немного улучшенная.
Этот код сейчас является частью TornadoFX Controls, и вы можете ознакомиться с последней версией DateTimePicker.java в GitHub Repo. Контроль доступен в 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 на последнюю версию.
Немного «улучшена» (по крайней мере для моих нужд) версия, которая работает с NullableTimeStamp ..., чтобы иметь возможность нуль (для облегчения работы с MySQL) ...
Незнайка, если это может помочь любому, но здесь это:
NullableTimeStamp:
public class NullableTimestamp extends Timestamp {
public NullableTimestamp() {
super(0L);
}
public NullableTimestamp(long value) {
super(value);
}
@Override
public String toString() {
return this.getTime() > 0L ? super.toString() : "";
}
public static NullableTimestamp valueOf(LocalDateTime localDateTime) {
return new NullableTimestamp(Timestamp.valueOf(localDateTime).getTime());
}
}
и DateTimePicker:
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) {
if(dateTimeValue.isAfter(LocalDateTime.of(1971, 6, 30, 12, 00)))
this.dateTimeValue.set(dateTimeValue);
else
this.dateTimeValue.set(null);
}
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();
}
}
}
Это в основном маски значение 0L Отметка, как если бы это был NULL ... надеюсь, что это может помочь приветствиям
Есть ли шансы выйти на Java 8? – Adam
Нет, сэр. Я должен работать над этим только. – Manivannan
Вы можете использовать [подборщик даты, созданный Кристианом Шудтом] (http://myjavafx.blogspot.ch/2012/01/javafx-calendar-control.html). Для учебника вы можете следить за блогами [Marco Jakob] (http://code.makery.ch/blog/javafx-2-date-picker/) – ItachiUchiha