java - 处理 PopupWindow 内的事件

标签 java datepicker javafx javafx-8 timepicker

我制作了自己的 TimePicker,它的工作方式应该与 DatePicker 非常相似。我想知道处理事件的最佳方法,例如选择时间并从弹出窗口确认。

我可以:

  • 使我的 TimePicker 的弹出节点(单独的 FXML 和 Controller )定义一个接口(interface),并强制 TimePicker 父级实现处理所选日期的方法。 (我非常希望避免以这种方式使用接口(interface)。这似乎是一种糟糕的做事方式。)
  • 向弹出窗口注册某种自定义事件处理程序和监听器?然后,如果我在从 PopupWindow 选择日期后单击“确定”,则可以一直触发事件直至 TimePicker。
  • 实现某种类似回调的函数。例如,在 Android 中,可以选择仅转到另一个屏幕来检索结果。我不确定JavaFX是否有这样的东西。屏幕彼此完全分开。

最佳答案

只需公开一个代表该值的ReadOnlyProperty。然后,弹出窗口的用户就可以观察该属性。

这是使用 DatePicker 的概念证明:

import java.time.LocalDate;

import javafx.application.Application;
import javafx.beans.property.ReadOnlyObjectProperty;
import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.geometry.Bounds;
import javafx.geometry.Insets;
import javafx.geometry.Point2D;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.DatePicker;
import javafx.scene.control.Label;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.stage.Popup;
import javafx.stage.PopupWindow;
import javafx.stage.Stage;


public class DatePickerPopupExample extends Application {

    @Override
    public void start(Stage primaryStage) {
        Label dateLabel = new Label(LocalDate.now().toString());
        Button changeButton = new Button("Change");

        HBox root = new HBox(5, dateLabel, changeButton);
        root.setAlignment(Pos.CENTER);

        changeButton.setOnAction(event -> {
            DatePickerPopup popup = new DatePickerPopup();
            popup.valueProperty().addListener((obs, oldDate, newDate) -> {
                dateLabel.setText(newDate.toString());
            });
            Bounds buttonBds = changeButton.getBoundsInLocal();
            Point2D loc = changeButton.localToScreen(buttonBds.getMaxX(), buttonBds.getMinY());
            popup.showPopup(primaryStage, loc.getX(), loc.getY());
        });

        Scene scene = new Scene(root, 250, 150);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public class DatePickerPopup  {
        private final ReadOnlyObjectWrapper<LocalDate> value = new ReadOnlyObjectWrapper<>();

        private final Popup popup ;

        public ReadOnlyObjectProperty<LocalDate> valueProperty() {
            return value.getReadOnlyProperty();
        }

        public final LocalDate getValue() {
            return valueProperty().get();
        }
        public DatePickerPopup(LocalDate date) {

            value.set(date);

            DatePicker picker = new DatePicker(date);
            Button okButton = new Button("OK");
            okButton.setOnAction(event -> {
                popup.hide();
                value.set(picker.getValue());
            });
            Button cancelButton = new Button("Cancel");
            cancelButton.setOnAction(event -> {
                popup.hide();
            });

            BorderPane root = new BorderPane();
            root.setCenter(picker);
            HBox buttons = new HBox(5, okButton, cancelButton);
            buttons.setPadding(new Insets(5));
            buttons.setAlignment(Pos.CENTER);
            root.setBottom(buttons);

            popup = new Popup();
            popup.getContent().add(root);
        }

        public DatePickerPopup() {
            this(LocalDate.now());
        }

        public void showPopup(Stage owner, double x, double y) {
            popup.show(owner, x, y);
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}

关于java - 处理 PopupWindow 内的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25751692/

相关文章:

java - Jackson json反序列化以整数(原始数据)作为POJO的关键

java - JPOS Q2初始化使用Tomcat6

css - 将输入类型日期更改为图标

wpf - DatePicker子类找不到模板

javascript - $(document).ready(function() 干扰日期选择器显示?

java - 打印专栏

java - 在 Java 中使用 for 循环将元素从一个列表转移到另一个列表

JavaFX:如何滑动图像

java - javafx 中按钮的操作事件不起作用

JavaFX 8. 在 BorderPane 中调整 SplitPane 的大小