当我有一个透明的SplitPane时,设置pickOnBounds=false不起作用,我不能点击拆分窗格后面的按钮。我有一个带有透明VBox和pickOnBounds=false的splitPane,我也用pickOnBounds=false设置了拆分窗格,但是鼠标点击不会转到它们下面的按钮。
我在顶部有一个按钮,部分被SplitPane覆盖,底部有打开/关闭鼠标透明度和pickOnBounds的按钮。
如果没有选中'Enable MouseTransparency‘,也没有选中'Enable Pick On Bound’,那么你应该可以点击SplitPane后面的按钮,但是你不能点击。image of app
会不会是Splitpane的皮肤类没有继承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;
}
}发布于 2021-05-03 21:42:08
我知道我已经5年后了,但我刚刚花了一个上午的时间来讨论同样的问题。
我认为真正的问题是-fx-background-color:transparent;,如果你删除了它,那么你应该有想要的行为。
https://stackoverflow.com/questions/37199672
复制相似问题