JavaFx按钮事件冒泡

bla*_*ter 2 events javafx button pane

我正在使用java8中的javafx开发一个项目.我集中了一个奇怪的情况:一个面板(类javafx.scene.layout.Pane)包含一个按钮(javafx.scene.control.Button)和另一个窗格.我希望鼠标点击的事件可以冒泡到父级.但是,只有在我点击窗格时才会出现这种情况,而单击按钮时则不会发生这种情况.下面是具有此行为的一个非常简单的示例的代码.有没有人有解决这个问题的建议?我知道我可以根据窗格创建自己的按钮..但这只是一个讨厌的解决方法.干杯

    package application;

    import javafx.animation.TranslateTransition;
    import javafx.application.Application;
    import javafx.event.Event;
    import javafx.event.EventHandler;
    import javafx.stage.Stage;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.image.Image;
    import javafx.scene.image.ImageView;
    import javafx.scene.layout.BorderPane;
    import javafx.scene.layout.Pane;
    import javafx.util.Duration;


    public class Main extends Application {

        double curScale;


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


                Button btn = new Button("test");
                btn.setLayoutX(50);
                Pane p2 = new Pane();
                p2.setPrefSize(20,20);
                p2.setStyle("-fx-background-color: #440000");
                Pane p = new Pane();
                p.getChildren().add(btn);
                p.getChildren().add(p2);

                root.setTop(p);

                p.setOnMouseClicked(new EventHandler<Event>() {

                    @Override
                    public void handle(Event event) {
                        System.out.println("event source " + event.getSource() + " target : " + event.getTarget());

                    }
                });

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

        public static void main(String[] args) {
            launch(args);
        }
    }
Run Code Online (Sandbox Code Playgroud)

jew*_*sea 8

默认情况下,该按钮将使用鼠标单击事件,而窗格则不会.

如果要使用父窗格事件处理程序拦截鼠标单击按钮,则应使用事件过滤器来执行此操作(在捕获阶段而不是冒泡阶段拦截事件).

如果您需要了解捕获与冒泡概念,请阅读事件处理.