2015-02-13 5 views
6

मैं जावा में नया हूं और मैंने javaFx का उपयोग कर जावा में अनुप्रयोगों को विकसित करना शुरू कर दिया है। बहुत खोज की लेकिन javaFx में कोई दिनांक और समय पिकर नहीं मिला। यहां तक ​​कि मैंने जेएफक्स्ट्रास की कोशिश की लेकिन यह काम नहीं कर रहा है। जिस तरह से मैं javafx 2.2.3 और जावा 7 का उपयोग कर रहा हूं। किसी भी मदद की अत्यधिक सराहना की जाएगी।क्या जावाएक्सएक्स के लिए कोई डेट और टाइम पिकर उपलब्ध है?

+3

जावा 8 तक कदम उठाने का कोई मौका दे सकता है? – Adam

+0

कोई महोदय नहीं। मुझे केवल इस पर काम करना है। – Manivannan

+1

आप [क्रिश्चियन श्डट द्वारा निर्मित दिनांक पिकर] का उपयोग कर सकते हैं (http://myjavafx.blogspot.ch/2012/01/javafx-calendar-control.html)। एक ट्यूटोरियल के लिए, आप [मार्को जैकोब ब्लॉग] का पालन कर सकते हैं (http://code.makery.ch/blog/javafx-2-date-picker/) – ItachiUchiha

उत्तर

2

जेएफएक्सट्रैस प्रोजेक्ट में जावाएफएक्स 2.2 के लिए एक वर्किंग वर्जन है। 2.212 शाखाओं के तहत repo पर CalendarPicker, CalendarTimePicker, ... के लिए देखें।

आप jfxtras.org से सबसे पुरानी रिलीज (2.2-r6-SNAPSHOT) डाउनलोड करके इसका परीक्षण कर सकते हैं।

इस छोटे स्निपेट, दोनों की तारीख और समय चुनने के लिए एक कैलेंडर बना देगा:

@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 में संपादित मूल्य के लिए प्रतिबद्ध नहीं करता है, तो निम्न कोड को ठीक करता है कि रूप में अच्छी तरह । dateTimeValueProperty करने के लिए अपने LocalDateTime संपत्ति बाइंड

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

:

टुकड़ा brevety के लिए Kotlin में लिखा है, आप आसानी से यह जावा के लिए IntelliJ विचार के माध्यम से बदल सकते हैं।

+0

क्या आप इसे जावा कोड के रूप में प्रदान कर सकते हैं? (यह एक जावा प्रश्न है, और intelliJ फ्रीवेयर नहीं है) – lumo

+1

निश्चित रूप से, मैं इसे जावा कोड में बदल दूंगा और इसे यहां पोस्ट करूंगा। IntelliJ सामुदायिक संस्करण पूरी तरह से स्वतंत्र है, यद्यपि। –

7

ऊपर डेटटाइम पिकर नियंत्रण का जावा संस्करण यहां थोड़ा सुधार हुआ है।

यह कोड अब TornadoFX Controls का हिस्सा है और आप GitHub Repo में DateTimePicker.java के नवीनतम संस्करण को देख सकते हैं। नियंत्रण इन निर्देशांकों के तहत रूप में अच्छी तरह Maven मध्य में उपलब्ध है:

<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 केवल तारीख मान है।

मैंने अभी तक इस घटक के लिए परीक्षण नहीं जोड़े हैं, इसलिए कार्यान्वयन बदल सकता है, नवीनतम संस्करण के लिए गिटहब की जांच करें।

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

यह मूल रूप से मास्क के रूप में अगर यह NULL था 0L टाइमस्टैम्प मूल्य ... उम्मीद है कि यह चीयर्स

संबंधित मुद्दे