2014-04-08 18 views
5

Ho appena iniziato a utilizzare il nuovo controllo JavaFX 8 DatePicker. In DatePicker User Experience Documentation, si afferma che ha due funzioni interessanti che vorrei avere nella mia applicazione GUI:JavaFX 8 DatePicker caratteristiche

  1. voglio cambiare il formato da mm/dd/yyyy a dd/mm/yyyy.
  2. Vorrei limitare la data che può essere selezionata. L'utente può selezionare solo da oggi fino allo stesso giorno del prossimo anno.
  3. date display Hijri oltre a quelle originali:

enter image description here

come implementare queste caratteristiche? JavaDoc non dice molto su di loro.

risposta

8

Ecco la piena attuazione:

import java.net.URL; 
import java.time.LocalDate; 
import java.time.chrono.HijrahChronology; 
import java.time.format.DateTimeFormatter; 
import java.util.ResourceBundle; 
import javafx.application.Platform; 
import javafx.fxml.FXML; 
import javafx.fxml.Initializable; 
import javafx.scene.control.DateCell; 
import javafx.scene.control.DatePicker; 
import javafx.scene.control.Label; 
import javafx.scene.input.MouseEvent; 
import javafx.util.Callback; 
import javafx.util.StringConverter; 

/** 
* 
* @author Fouad 
*/ 
public class FXMLDocumentController implements Initializable 
{ 
    @FXML 
    private DatePicker dpDate; 

    @Override 
    public void initialize(URL url, ResourceBundle rb) 
    { 
     dpDate.setValue(LocalDate.now()); 
     dpDate.setChronology(HijrahChronology.INSTANCE); 

     Callback<DatePicker, DateCell> dayCellFactory = dp -> new DateCell() 
     { 
      @Override 
      public void updateItem(LocalDate item, boolean empty) 
      { 
       super.updateItem(item, empty); 

       if(item.isBefore(LocalDate.now()) || item.isAfter(LocalDate.now().plusYears(1))) 
       { 
        setStyle("-fx-background-color: #ffc0cb;"); 
        Platform.runLater(() -> setDisable(true)); 

        /* When Hijri Dates are shown, setDisable() doesn't work. Here is a workaround */ 
        //addEventFilter(MouseEvent.MOUSE_CLICKED, e -> e.consume()); 
       } 
      } 
     }; 

     StringConverter converter = new StringConverter<LocalDate>() 
     { 
      final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy"); 

      @Override 
      public String toString(LocalDate date) 
      { 
       if(date != null) return dateFormatter.format(date); 
       else return ""; 
      } 

      @Override 
      public LocalDate fromString(String string) 
      { 
       if(string != null && !string.isEmpty()) 
       { 
        LocalDate date = LocalDate.parse(string, dateFormatter); 

        if(date.isBefore(LocalDate.now()) || date.isAfter(LocalDate.now().plusYears(1))) 
        { 
         return dpDate.getValue(); 
        } 
        else return date; 
       } 
       else return null; 
      } 
     }; 

     dpDate.setDayCellFactory(dayCellFactory); 
     dpDate.setConverter(converter); 
     dpDate.setPromptText("dd/MM/yyyy"); 
    } 

} 
Problemi correlati