JavaFX 激活日期选择器下拉菜单

JavaFX Activate Datepicker dropdown

如何在日期选择器获得焦点时激活它的下拉日历?

Letter.FXML

<DatePicker fx:id="letterDatePicker" editable="false" focusTraversable="false" layoutX="184.0" layoutY="174.0" prefHeight="25.0" prefWidth="178.0" promptText="Select date">

FXMLControllerLetter.java

@FXML
private void companyName(ActionEvent event)
{
    if(fxTxtCompanyName.getText().isEmpty())
    {
        Stage letterStage = (Stage) ((Node) event.getSource()).getScene().getWindow();

        Alert alert = new Alert(AlertType.ERROR);
        alert.setTitle("Insufficient Data");
        alert.initOwner(letterStage);

        alert.setHeaderText("Lacking company name");
        alert.setContentText("Looks like you forgot to input the company name!");

        alert.showAndWait();
    }
    else
    {
        fxTxtCompanyName.setText(fxTxtCompanyName.getText().toUpperCase());
        letterDatePicker.requestFocus();
        letterDatePicker.show();
    }

}

日期格式转换器 - 我希望日期选择器的格式为 "MMMM dd, yyyy" 所以我设置了 StringConverter 以获得我想要的输出格式。

@Override
public void initialize(URL url, ResourceBundle rb) 
{
    // TODO
    fxLblCurrentDate.setText(dateNow());

    // <editor-fold defaultstate="collapsed" desc="DATE FORMAT CONVERTER">
    String pattern = "MMMM dd, yyyy";
    letterDatePicker.setConverter(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;
            }
        }
    });
    // </editor-fold>
}

调用它的show()方法。请参阅下面的隐式完整示例:

@Override
public void start( Stage stage )
{

    final DatePicker datePicker = new DatePicker();
    datePicker.setEditable( false );
    datePicker.setFocusTraversable( false );
    datePicker.setPromptText( "Select date" );
    datePicker.setPrefWidth( 170 );

    Button b = new Button( "choose date" );
    b.setOnAction( new EventHandler<ActionEvent>()
    {
        @Override
        public void handle( ActionEvent event )
        {
            datePicker.show();
            datePicker.requestFocus();
        }
    } );

    Scene scene = new Scene( VBoxBuilder.create().children( datePicker, b ).build(), 800, 600 );
    stage.setScene( scene );
    stage.show();
}