Javafx pickOnBounds 设置因 SplitPane 而失败 - 无法通过透明的 Sp

当我有一个透明的 SplitPane 时,设置 pickOnBounds=false 不起作用,我无法单击拆分 Pane 后面的按钮。 我有一个带有 pickOnBounds=false 的透明 VBox 的 splitPane 我还使用 pickOnBounds=false 设置了拆分 Pane ,但是鼠标单击不会到达它们下方的按钮。

我在顶部有一个按钮,部分被 SplitPane 覆盖, 底部有一些按钮可以打开/关闭鼠标透明度和 pickOnBounds。

当“启用鼠标透明度”未选中时, 并且未选中“Enable Pick On Bounds”,那么您应该可以单击 SplitPane 后面的按钮,但您不能。 image of app

会不会是Splitpane的skinclass没有继承pickOnBounds设置???

这是说明问题的示例代码:

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;
    }
}

最佳答案

我知道我已经 5 年过去了,但我只是在同一个问题上花了一个上午。

我认为真正的问题是 -fx-background-color:transparent;,如果您删除它,那么您应该会得到所需的行为。

关于Javafx pickOnBounds 设置因 SplitPane 而失败 - 无法通过透明的 SplitPane 单击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37199672/

相关文章:

objective-c - 自定义 UIButton 焦点在 tvOS 中无法正常工作

android - 相同的 ImageButtons 消耗大量内存

algorithm - 跳跃点搜索 : mix between Normal and Orthogo

android - 从 Custom Content Provider 访问数据

google-apps-script - 如何更新谷歌可视化仪表板的底层谷歌数据表并刷新仪表板 Vi

python - 在 Python 中获取页面的所有请求 url

android - 交错 GridView 中的可点击 TextView

java - Mallet:字母不匹配异常

java - 重置运行时权限

r - 如何在 Jupyter 中启用 R 语法高亮显示?