特定格式的 JavaFX DatePicker getValue

Posted

技术标签:

【中文标题】特定格式的 JavaFX DatePicker getValue【英文标题】:JavaFX DatePicker getValue in a specific format 【发布时间】:2015-01-06 01:24:56 【问题描述】:

我目前正在使用 Scene Builder 制作 javafx 场景。我想以特定格式从日期选择器中获取价值。只需使用 datePicker.getValue() 以 yyyy-mm-dd 形式返回日期值。我想要 MMM dd, yyyy 形式。有人可以帮我吗?

当前完整的datePickerController代码是这样的

package date.picker;

import java.net.URL;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.Button;
import javafx.scene.control.DatePicker;
import javafx.scene.control.TextField;
import javafx.util.StringConverter;

/**
 * FXML Controller class
 *
 * @author Dushyant Patel
 */
public class DatePickerController implements Initializable 

@FXML
private TextField display;
@FXML
private DatePicker datePicker;
@FXML
private Button getDateBtn;
@FXML
private Button setDateBtn;

@FXML
private void getDateAction(ActionEvent event) 

    LocalDate date = datePicker.getValue();
    if (date != null) 
        display.setText(date.toString());
     else 
        display.setText("");
    


@FXML
private void datePickerAction(ActionEvent event) 
    LocalDate date = datePicker.getValue();
    if (date != null) 
        display.setText(date.toString());
     else 
        display.setText("");
    


@FXML
private void setDateAction(ActionEvent event) 
    if (!display.getText().trim().equals("")) 
        if (display.getText().length() != 10) 
            Alert alert = new Alert(AlertType.ERROR);
            alert.setTitle("Error Dialog");
            alert.setHeaderText("Date Error");
            alert.setContentText("Please type date in the correct date format!");

            alert.showAndWait();
         else 
            LocalDate date = LocalDate.parse(display.getText());
            datePicker.setValue(date);
        
     else 
        datePicker.setValue(null);
    



/**
 * Initializes the controller class.
 */
@Override
public void initialize(URL url, ResourceBundle rb) 
    String pattern = "MMM dd, yyyy";
    StringConverter converter = new StringConverter<LocalDate>() 
        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern(pattern);

        @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()) 
                return LocalDate.parse(string, dateFormatter);
             else 
                return null;
            
        
    ;

    datePicker.setConverter(converter);



【问题讨论】:

Format date in java的可能重复 这个问题似乎只涉及java.util.Dates,而不是java.time.LocalDates 认真阅读有帮助.... :-D ... 所以使用: String date(LocalDate date) DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd, yyyy");返回日期。格式(格式化程序); 【参考方案1】:

DataPicker 在数据选择器中引用转换器

 datePicker.setConverter(new StringConverter<LocalDate>() 
 String pattern = "yyyy-MM-dd";
 DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern(pattern);

 
     datePicker.setPromptText(pattern.toLowerCase());
 

 @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()) 
         return LocalDate.parse(string, dateFormatter);
      else 
         return null;
     
 
);

【讨论】:

谢谢,这对@Reegan 很有帮助【参考方案2】:

使用您指定的模式创建一个DateTimeFormatter(您为该模式提供的语法完全正确;文档详细介绍了该模式的语法)。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd, yyyy");

// ...

LocalDate date = datePicker.getValue();
if (date != null) 
    display.setText(formatter.format(date));
 else 
    display.setText("");

【讨论】:

【参考方案3】:

使用 setConverter 不会改变你用来获取 DatePicker 值的 .getValue() 方法的格式 setConverter 只会改变 DatePicker 上显示的日期。

例如获取 DatePicker 值:-

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd, yyyy",Locale.US);
String formattedValue = (myDatePicker.getValue()).format(formatter);

并设置 DatePicker 的值

String dateValue = "01 12, 2015";
myDatePicker.setValue(LocalDate.parse(dateValue,formatter));

【讨论】:

【参考方案4】:

docs 提供了一个很好的例子。只要确保你的控制器实现Initializable,然后像这样初始化它:

public class MyController implements Initializable 

  @FXML
  private DatePicker myDatePicker;

  @Override
  public void initialize(URL location, ResourceBundle resources) 

    myDatePicker.setConverter(
        new StringConverter<>() 
          final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

          @Override
          public String toString(LocalDate date) 
            return (date != null) ? dateFormatter.format(date) : "";
          

          @Override
          public LocalDate fromString(String string) 
            return (string != null && !string.isEmpty())
                ? LocalDate.parse(string, dateFormatter)
                : null;
          
        );

  


【讨论】:

【参考方案5】:

使用 SimleDateFormat:

    SimpleDateFormat format = new SimpleDateFormat("MMM dd, yyyy");
    setText(format.format(date));

糟糕……LocalDate 不是日期……

   String date(LocalDate date) 
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd, yyyy");
        return date.format(formatter);
    

【讨论】:

您不能将其与java.time.LocalDate 一起使用。 对不起...戴眼镜可能会有所帮助:-D 仅供参考,非常麻烦的旧日期时间类,如 java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 现在是 legacy,被 Java 8 中内置的 java.time 类所取代,之后。见Tutorial by Oracle。

以上是关于特定格式的 JavaFX DatePicker getValue的主要内容,如果未能解决你的问题,请参考以下文章

javafx datepicker如何自定义

JavaFX 8 DatePicker 风格

JavaFX8 DatePicker 按钮大小更改

DatePicker 的值在 Javafx 中 Tableview 的行中不断重置

JavaFX:setDisable(true)DatePicker问题

JavaFX datepicker 不更新值