【问题标题】:JavaFx: show DatePickerJavaFx:显示日期选择器
【发布时间】:2018-01-07 02:39:30
【问题描述】:

我有一个ComboBox<MyItem>,当我从ComboBox 中选择一个特殊项目时,我想显示一个DatePicker。我创建了一个扩展 ComboBox 的类,并且该类中有一个 DatePicker。我在其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);
        }
    }
}

所以如果我选择 DATE 项目,DatePicker 应该会弹出,如果我选择一个日期,我想添加为 ComboBox 的值 首先为什么 datePicker 不弹出?第二个问题是可以将所选日期作为值添加到组合框。

【问题讨论】:

  • 请显示更多代码。您将显示的代码放在哪里。我们需要一些上下文。
  • 我已经编辑了我的代码,所以你可以看到整个班级。
  • 您永远不会将日期选择器放在场景图中的任何位置。您需要将其添加到某个父级(显示在某处)以使其成为 UI 的一部分。 show() 方法仅显示其弹出窗口,但我认为它必须实际可见才能执行任何操作。
  • 啊好吧,那你知道我该如何解决这个问题吗?
  • 不:我不知道你想做什么。具体来说,您希望日期选择器出现在哪里

标签: java javafx combobox datepicker javafx-8


【解决方案1】:

我假设你需要这样的东西:

我通过使用来自ControlsFX library 的弹出类来做到这一点。

玩这个演示应用程序以了解主要思想。

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();
    }
}

【讨论】:

  • 再问一个问题我没有像datePopOver.setTitle("Enter new date");datePopOver.setCloseButtonEnabled(true); 这样的方法你知道为什么吗?导入,类是一样的
  • 我还有一个问题,当我选择一个日期时,comboBox 不会更新从 datePicker 中选择的值。我想是因为我的 stringConver 在我选择一个日期后没有被触发。我该怎么做?
  • @Dmytro Maslenko,您能否更新您的答案以处理添加到ComboBox 的新日期? items.set(customComboBox.getSelectionModel().getSelectedIndex(), new ComboBoxNode(newDate, DATE_TYPE)); 应该替换 items.set(0, new ComboBoxNode(newDate, DATE_TYPE));
  • @Sunflame,关于错过的方法。确保您在项目依赖项中拥有最新的库版本。试试这个解决方法:titleProperty().set(title);和 closeButtonEnabledProperty().setValue(true);
  • @Sunflame 关于未触发的更新。你可以有相同的日期吗?在这种情况下,触发器会跳过它。否则提供您的字符串转换器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-04
  • 2023-03-08
  • 2014-11-03
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
相关资源
最近更新 更多