Button JavaFX:窗口关闭事件阻止按钮操作

Button JavaFX:窗口关闭事件阻止按钮操作,button,popup,javafx,focus,Button,Popup,Javafx,Focus,我确实在一个新的阶段中实现了一个弹出窗口,现在我正在尝试关闭它,无论我在哪里单击(不包括弹出窗口本身)。这个很好用。尽管当我点击背景上的另一个元素(如按钮)时弹出窗口消失,但我仍然希望获取按钮的事件。对如何实现这一目标有何建议?我列举了一个简短的例子 package application; import javafx.application.Application; import javafx.beans.value.ChangeListener; import javafx.beans.v

我确实在一个新的阶段中实现了一个弹出窗口,现在我正在尝试关闭它,无论我在哪里单击(不包括弹出窗口本身)。这个很好用。尽管当我点击背景上的另一个元素(如按钮)时弹出窗口消失,但我仍然希望获取按钮的事件。对如何实现这一目标有何建议?我列举了一个简短的例子

package application;

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
        try {
            BorderPane root = new BorderPane();
            Scene scene = new Scene(root, 400, 400);
            scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
            primaryStage.setScene(scene);

            // the popup
            Pane p = new Pane();
            p.setPrefSize(100, 100);
            p.setStyle("-fx-background-color: #660066");
            final Stage popUp = new Stage();
            Scene popUpScene = new Scene(p);

            popUp.setScene(popUpScene);

            Button btnShow = new Button("Show popUp");
            root.setCenter(btnShow);
            btnShow.setOnMouseClicked(new EventHandler<Event>() {

                @Override
                public void handle(Event event) {
                    ChangeListener stageFocusListener = new ChangeListener<Boolean>() {
                        @Override
                        public void changed(ObservableValue<? extends Boolean> arg0, Boolean oldPropertyValue, Boolean newPropertyValue) {
                            if (!newPropertyValue) {
                                popUp.hide();
                            }
                        }
                    };
                    popUp.focusedProperty().addListener(stageFocusListener);
                    popUp.show();

                }
            });

            Button btnTest = new Button("test");
            root.setRight(btnTest);
            btnTest.setOnMouseClicked(new EventHandler<Event>() {

                @Override
                public void handle(Event event) {
                    System.out.println("Button test clicked");
                }
            });

            primaryStage.show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}
包应用;
导入javafx.application.application;
导入javafx.beans.value.ChangeListener;
导入javafx.beans.value.observeValue;
导入javafx.event.event;
导入javafx.event.EventHandler;
导入javafx.stage.stage;
导入javafx.scene.scene;
导入javafx.scene.control.Button;
导入javafx.scene.layout.BorderPane;
导入javafx.scene.layout.Pane;
公共类主扩展应用程序{
@凌驾
公共无效开始(阶段primaryStage){
试一试{
BorderPane根=新的BorderPane();
场景=新场景(根,400400);
scene.getStylesheets().add(getClass().getResource(“application.css”).toExternalForm());
初级阶段。场景(场景);
//弹出窗口
窗格p=新窗格();
p、 setPrefSize(100100);
p、 设置样式(“-fx背景色:#660066”);
最终阶段弹出窗口=新阶段();
场景popUpScene=新场景(p);
popUp.setScene(PopupUpscene);
按钮BTN显示=新按钮(“显示弹出窗口”);
根。设置中心(btnShow);
setOnMouseClicked(新的EventHandler(){
@凌驾
公共无效句柄(事件){
ChangeListener stageFocusListener=新的ChangeListener(){
@凌驾

public void changed(observeValue您可以将隐藏事件放入队列,而不会干扰按钮的事件处理过程

if (!newPropertyValue) {
    Platform.runLater(new Runnable() {
        @Override
        public void run() {
            popUp.hide();
        }
    });
}