如何在嵌套分割窗格的分隔符上检测鼠标单击事件?

时间:2017-12-14 06:41:57

标签: java javafx javafx-8

我试图将鼠标点击监听器添加到拆分窗格的分隔符中。

它可以工作,但是如果在此拆分窗格中嵌套了一个拆分窗格,而不是获取此拆分窗格的分隔符,我会得到子拆分窗口的分隔符。这是一个有效的例子。

如您所见,这里的目的是将click侦听器放在primarySplitPane的分隔符上。但是,监听器放在secondarySplitPane的分隔符上。

public class DividerTest extends Application {

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

    }

    @Override
    public void start ( Stage stage ) {

        VBox boxA = new VBox();
        VBox boxB = new VBox();
        VBox boxC = new VBox();

        SplitPane secondarySplitPane = new SplitPane();
        secondarySplitPane.getItems().addAll( boxB, boxC );
        secondarySplitPane.setOrientation( Orientation.VERTICAL );

        SplitPane primarySplitPane = new SplitPane();
        primarySplitPane.getItems().addAll( boxA, secondarySplitPane );

        primarySplitPane.prefWidthProperty().bind( stage.widthProperty() );
        primarySplitPane.prefHeightProperty().bind( stage.heightProperty() );

        Scene scene = new Scene( new Group(), 800, 600 );
        ((Group) scene.getRoot()).getChildren().addAll( primarySplitPane );
        stage.setScene( scene );

        stage.show();

        Node primaryDivider = primarySplitPane.lookup(".split-pane-divider");

        primaryDivider.setOnMouseClicked( ( e ) -> System.out.println ( "Clicked" ) );
    }
}

如何告诉.lookup获取正确的分隔符?

1 个答案:

答案 0 :(得分:2)

您的代码正在处理垂直分割器,但不在水平分割器上。这可以通过收集所有分隔器而不仅仅是第一个分隔器来简单地修复。如果要在不同的分隔符上定义不同的操作,可以检查父级:

Set<Node> dividers = primarySplitPane.lookupAll(".split-pane-divider");

for (Node divider : dividers) {
    if (divider.getParent() == primarySplitPane)
        divider.setOnMouseClicked(e -> System.out.println("Primary Clicked" ));
    else if (divider.getParent() == secondarySplitPane)
        divider.setOnMouseClicked(e -> System.out.println("Secondary Clicked"));

}