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();
}
如何在日期选择器获得焦点时激活它的下拉日历?
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();
}