JavaFx:显示日期选择器
我有一个JavaFx:显示日期选择器,java,javafx,combobox,datepicker,javafx-8,Java,Javafx,Combobox,Datepicker,Javafx 8,我有一个组合框,当我从组合框中选择一个特殊项目时,我想显示一个日期选择器。我创建了一个扩展ComboBox的类,该类中有一个日期选择器。我已将侦听器添加到其selectedItemProperty: public class CustomComboBox extends ComboBox<MyItem>{ private DatePicker datePicker; public CustomComboBox(){ getSelectionMode
组合框
,当我从组合框
中选择一个特殊项目时,我想显示一个日期选择器
。我创建了一个扩展ComboBox的类,该类中有一个日期选择器。我已将侦听器添加到其selectedItemProperty
:
public class CustomComboBox extends ComboBox<MyItem>{
private DatePicker datePicker;
public CustomComboBox(){
getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> {
if (MyItem.DATE.equals(newValue)) {
initDatePicker();
datePicker.show();
datePicker.requestFocus();
}
});
}
private void initDatePicker() {
if (datePicker == null) {
datePicker = new DatePicker();
datePicker.setFocusTraversable(false);
}
}
}
公共类CustomComboBox扩展ComboBox{
私人日期选择器日期选择器;
公共CustomComboBox(){
getSelectionModel().SelectEditeProperty().addListener((可观察、旧值、新值)->{
if(MyItem.DATE.equals(newValue)){
initDatePicker();
datePicker.show();
datePicker.requestFocus();
}
});
}
私有void initDatePicker(){
if(datePicker==null){
datePicker=新的日期选择器();
datePicker.setFocusTraversable(false);
}
}
}
因此,如果我选择了日期
项,则会弹出日期选择器,如果我选择了一个日期,则我想添加为组合框的值
首先,为什么不弹出日期选择器?第二个问题是可以将所选日期作为值添加到comboBox中。我假设您需要这样的内容: 我是通过使用来自的弹出类来实现的 使用此演示应用程序了解主要内容
import org.controlsfx.control.PopOver;
// here all other needed dependencies
public class Main extends Application {
private static final String DATE_TYPE = "DATE";
private class ComboBoxNode {
private Object value;
private String type;
private ComboBoxNode(final Object value, final String type) {
this.value = value;
this.type = type;
}
@Override
public String toString() {
return Objects.toString(value);
}
}
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
final ObservableList<ComboBoxNode> items =
FXCollections.observableArrayList(
new ComboBoxNode(LocalDate.now(), DATE_TYPE),
new ComboBoxNode("11:35AM", "TIME"));
final PopOver datePopOver = new PopOver();
datePopOver.setTitle("Enter new date");
datePopOver.setCornerRadius(10);
datePopOver.setHeaderAlwaysVisible(true);
datePopOver.setCloseButtonEnabled(true);
datePopOver.setAutoHide(true);
final ComboBox<ComboBoxNode> customComboBox = new ComboBox<>(items);
customComboBox.getSelectionModel().selectedItemProperty().addListener((o, old, newNode) -> {
if (newNode != null) {
if (newNode.type.equals(DATE_TYPE)) {
final DatePicker datePicker = new DatePicker((LocalDate) newNode.value);
datePicker.valueProperty().addListener((obs, oldDate, newDate) -> {
items.set(customComboBox.getSelectionModel().getSelectedIndex(), new ComboBoxNode(newDate, DATE_TYPE));
datePopOver.hide();
});
final StackPane stackPane = new StackPane(datePicker);
stackPane.setPadding(new Insets(10, 10, 10, 10));
datePopOver.setContentNode(stackPane);
datePopOver.show(customComboBox);
} else {
datePopOver.hide();
}
}
});
final FlowPane pane = new FlowPane(customComboBox);
pane.setPadding(new Insets(10, 10, 10, 10));
pane.setPrefWidth(400);
pane.setPrefHeight(300);
// Show Scene
final Scene scene = new Scene(pane);
primaryStage.setTitle("Popup calendar");
primaryStage.setScene(scene);
primaryStage.show();
}
}
import org.controlsfx.control.PopOver;
//这里是所有其他需要的依赖项
公共类主扩展应用程序{
私有静态最终字符串日期\u TYPE=“DATE”;
私有类ComboxNode{
私人客体价值;
私有字符串类型;
私有ComboxNode(最终对象值、最终字符串类型){
这个值=值;
this.type=type;
}
@凌驾
公共字符串toString(){
返回Objects.toString(值);
}
}
公共静态void main(字符串[]args){
发射(args);
}
@凌驾
公共无效开始(阶段primaryStage){
最终可观察列表项目=
FXCollections.observableArrayList(
新的ComboBoxNode(LocalDate.now(),日期类型),
新的ComboBoxNode(“上午11:35”,“时间”);
最终PopOver datePopOver=新PopOver();
datePopOver.setTitle(“输入新日期”);
datePopOver.setCornerRadius(10);
datePopOver.SetHeaderWaysVisible(真);
datePopOver.setCloseButtonEnabled(真);
datePopOver.setAutoHide(true);
最终组合框customComboBox=新组合框(项目);
customComboBox.getSelectionModel().SelectEditeProperty().addListener((o,旧,新节点)->{
if(newNode!=null){
if(newNode.type.equals(DATE\u type)){
final DatePicker DatePicker=newdatepicker((LocalDate)newNode.value);
datePicker.valueProperty().addListener((obs、oldDate、newDate)->{
items.set(customComboBox.getSelectionModel().GetSelectedNodex(),新ComboBoxNode(newDate,DATE_TYPE));
datePopOver.hide();
});
最终StackPane StackPane=新的StackPane(日期选择器);
stackPane.setPadding(新的插图(10,10,10,10));
setContentNode(stackPane);
datePopOver.show(customComboBox);
}否则{
datePopOver.hide();
}
}
});
最终流程窗格=新流程窗格(customComboBox);
窗格。设置填充(新插图(10,10,10,10));
窗格宽度(400);
窗格。设置高度(300);
//演出现场
最终场景=新场景(窗格);
primaryStage.setTitle(“弹出日历”);
初级阶段。场景(场景);
primaryStage.show();
}
}
我想你需要这样的东西:
我是通过使用来自的弹出类来实现的
使用此演示应用程序了解主要内容
import org.controlsfx.control.PopOver;
// here all other needed dependencies
public class Main extends Application {
private static final String DATE_TYPE = "DATE";
private class ComboBoxNode {
private Object value;
private String type;
private ComboBoxNode(final Object value, final String type) {
this.value = value;
this.type = type;
}
@Override
public String toString() {
return Objects.toString(value);
}
}
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
final ObservableList<ComboBoxNode> items =
FXCollections.observableArrayList(
new ComboBoxNode(LocalDate.now(), DATE_TYPE),
new ComboBoxNode("11:35AM", "TIME"));
final PopOver datePopOver = new PopOver();
datePopOver.setTitle("Enter new date");
datePopOver.setCornerRadius(10);
datePopOver.setHeaderAlwaysVisible(true);
datePopOver.setCloseButtonEnabled(true);
datePopOver.setAutoHide(true);
final ComboBox<ComboBoxNode> customComboBox = new ComboBox<>(items);
customComboBox.getSelectionModel().selectedItemProperty().addListener((o, old, newNode) -> {
if (newNode != null) {
if (newNode.type.equals(DATE_TYPE)) {
final DatePicker datePicker = new DatePicker((LocalDate) newNode.value);
datePicker.valueProperty().addListener((obs, oldDate, newDate) -> {
items.set(customComboBox.getSelectionModel().getSelectedIndex(), new ComboBoxNode(newDate, DATE_TYPE));
datePopOver.hide();
});
final StackPane stackPane = new StackPane(datePicker);
stackPane.setPadding(new Insets(10, 10, 10, 10));
datePopOver.setContentNode(stackPane);
datePopOver.show(customComboBox);
} else {
datePopOver.hide();
}
}
});
final FlowPane pane = new FlowPane(customComboBox);
pane.setPadding(new Insets(10, 10, 10, 10));
pane.setPrefWidth(400);
pane.setPrefHeight(300);
// Show Scene
final Scene scene = new Scene(pane);
primaryStage.setTitle("Popup calendar");
primaryStage.setScene(scene);
primaryStage.show();
}
}
import org.controlsfx.control.PopOver;
//这里是所有其他需要的依赖项
公共类主扩展应用程序{
私有静态最终字符串日期\u TYPE=“DATE”;
私有类ComboxNode{
私人客体价值;
私有字符串类型;
私有ComboxNode(最终对象值、最终字符串类型){
这个值=值;
this.type=type;
}
@凌驾
公共字符串toString(){
返回Objects.toString(值);
}
}
公共静态void main(字符串[]args){
发射(args);
}
@凌驾
公共无效开始(阶段primaryStage){
最终可观察列表项目=
FXCollections.observableArrayList(
新的ComboBoxNode(LocalDate.now(),日期类型),
新的ComboBoxNode(“上午11:35”,“时间”);
最终PopOver datePopOver=新PopOver();
datePopOver.setTitle(“输入新日期”);
datePopOver.setCornerRadius(10);
datePopOver.SetHeaderWaysVisible(真);
datePopOver.setCloseButtonEnabled(真);
datePopOver.setAutoHide(true);
最终组合框customComboBox=新组合框(项目);
customComboBox.getSelectionModel().SelectEditeProperty().addListener((o,旧,新节点)->{
if(newNode!=null){
if(newNode.type.equals(DATE\u type)){
final DatePicker DatePicker=newdatepicker((LocalDate)newNode.value);
datePicker.valueProperty().addListener((obs、oldDate、newDate)->{
items.set(customComboBox.getSelectionModel().GetSelectedNodex(),新ComboBoxNode(newDate,DATE_TYPE));
datePopOver.hide();
});
最终StackPane StackPane=新的StackPane(日期选择器);
stackPane.setPadding(新的插图(10,10,10,10));