2015-02-13 2 views
6

Я новичок в Java, и я начал разрабатывать приложения в java с помощью javaFx. много искал, но не смог найти дату и время в javaFx. Даже я попробовал JFxtras, но не работал. Кстати, я использую javafx 2.2.3 и java 7. Любая помощь будет высоко оценена.Есть ли возможность выбора даты и времени для javaFx?

+3

Есть ли шансы выйти на Java 8? – Adam

+0

Нет, сэр. Я должен работать над этим только. – Manivannan

+1

Вы можете использовать [подборщик даты, созданный Кристианом Шудтом] (http://myjavafx.blogspot.ch/2012/01/javafx-calendar-control.html). Для учебника вы можете следить за блогами [Marco Jakob] (http://code.makery.ch/blog/javafx-2-date-picker/) – ItachiUchiha

ответ

2

Проект 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(); 
} 

Date and Time

2

Я считаю, что наиболее удобно для ввода времени с помощью клавиатуры, а не менять его с ползунками. Это довольно легко расширить включенную DatePicker выглядеть следующим образом:

DateTimePicker for JavaFX 8

Я также считаю, что раздражает, что 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.

+0

Вы могли бы предоставить это как java-код? (его вопрос java, и intelliJ не является бесплатным) – lumo

+1

Несомненно, я преобразую его в Java-код и отправлю его здесь. Однако IntelliJ Community Edition совершенно свободен. –

7

Вот приведенная выше версия 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 на последнюю версию.

2

Немного «улучшена» (по крайней мере для моих нужд) версия, которая работает с 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 ... надеюсь, что это может помочь приветствиям