steve m
steve m

Reputation: 31

Javafx pickOnBounds setting fails with SplitPane - can't click thru a transparent SplitPane

When I have a transparent SplitPane, setting pickOnBounds=false does not work, I cannot click on a button behind the splitpane. I have a splitPane with a transparent VBox with pickOnBounds=false I also set the splitpane with pickOnBounds=false, however a mouse click will not go thru to the button beneath them.

I have a button at the top that is partially covered by a SplitPane, There are buttons at the bottom that turn on/off mousetransparency and pickOnBounds.

When 'Enable MouseTransparency' is unchecked, and 'Enable Pick On Bounds' is unchecked, Then you should be able to click on the button that is behind the SplitPane, but you can't.image of app

Could it be that the skinclass of Splitpane is not inheriting the pickOnBounds setting???

Here is example code that illustrated the problem:

package  splitpaneprob;

import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.geometry.Orientation;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.SplitPane;
import javafx.scene.control.ToggleButton;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

// Demonstrates the JavaFX node mouseTransparent and pickOnBounds properties.
// shows that 'PickOnBounds=false' does not work for a SplitPane that has a transparent background and you want mouseclicks to go thru
public class PickOnBoundsFails extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) throws Exception {
        ToggleButton testButton = new ToggleButton("");

        VBox layer1 = new VBox();
        layer1.getChildren().add(testButton);

        SplitPane layer3 = new SplitPane();
        layer3.setMaxWidth(140);

        layer3.setOrientation(Orientation.VERTICAL);
        layer3.setStyle("-fx-background-color:transparent;-fx-border-color:teal");
        layer3.setPrefWidth(120);
        VBox topItem = new VBox();
        topItem.setPickOnBounds(false);
        topItem.setPrefHeight(100);
        topItem.setAlignment(Pos.BOTTOM_LEFT);
        Button topButton = new Button();
        topButton.setMouseTransparent(false);
        topItem.getChildren().add(topButton);
        VBox bottomItem = new VBox();
        Button bottomButton = new Button("click me");
        bottomItem.getChildren().add(bottomButton);
        layer3.getItems().add(topItem);
        layer3.getItems().add(bottomItem);

        StackPane stack = new StackPane();

        stack.getChildren().setAll(layer1, layer3);
        stack.setStyle("-fx-background-color: azure;");

        VBox layout = new VBox();
        layout.getChildren().setAll(
                stack,
                createControls(testButton, layer3, topButton)
        );

        stage.setScene(new Scene(layout));
        stage.show();
    }

    private VBox createControls(ToggleButton controlledButton, SplitPane controlledNode, Button buttonOnSplitPane) {
        controlledButton.textProperty().bind(
                Bindings
                .when(controlledNode.mouseTransparentProperty()).then("Completely Clickable")
                .otherwise(Bindings
                        .when(controlledNode.pickOnBoundsProperty()).then("Partially clickable")
                        .otherwise("Should Be fully Clickable")
                )
        );
        buttonOnSplitPane.textProperty().bind(
                Bindings
                .when(controlledNode.mouseTransparentProperty()).then("NOT Clickable")
                .otherwise("Clickable")
        );
        CheckBox enableMouseTransparency = new CheckBox("Enable MouseTransparency on ScrollPane");
        enableMouseTransparency.setSelected(controlledNode.isMouseTransparent());
        controlledNode.mouseTransparentProperty().bind(enableMouseTransparency.selectedProperty());

        CheckBox enablePickOnBounds = new CheckBox("Enable Pick On Bounds on ScrollPane");
        enablePickOnBounds.setSelected(controlledNode.isPickOnBounds());
        controlledNode.pickOnBoundsProperty().bind(enablePickOnBounds.selectedProperty());

        VBox controls = new VBox(10);
        controls.setStyle("-fx-background-color: cornsilk; -fx-padding: 10;");
        controls.getChildren().addAll(
                enableMouseTransparency,
                enablePickOnBounds
        );

        return controls;
    }
}

Upvotes: 3

Views: 329

Answers (1)

Andrea Vacondio
Andrea Vacondio

Reputation: 954

I know I'm 5 years later but I just spent a morning on the same issue.

I think the real problem is -fx-background-color:transparent;, if you remove that then you should have the desired behavior.

Upvotes: 0

Related Questions