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().getSelectedInde‌​x(), 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().GetSelectedNode‌​x(),新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().getSelectedInde‌​x(), 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().GetSelectedNode‌​x(),新ComboBoxNode(newDate,DATE_TYPE));
datePopOver.hide();
});
最终StackPane StackPane=新的StackPane(日期选择器);
stackPane.setPadding(新的插图(10,10,10,10));