JavaFX:如何使下层节点可访问?
问题描述:
我在StackPane
内有Pane
和VBox
。我首先添加了Pane
,并在其上添加了VBox
。 VBox
包括几个kes,它们又有小孩Button
s。我使用正常的Pane
作为“画布”来定位Line
。 Line
以及Button
需要互动。因此,通过点击它们,它们将例如改变它们的颜色。 但目前Pane
及其Line
对象显示,但它们覆盖VBox
所以我不能与他们互动,但只有与Button
s。JavaFX:如何使下层节点可访问?
我该如何提供,我也可以与Line
进行互动,尽管它们位于StackPane
的较低层?
答
您可以将容器Node
S(VBox
和HBox
)的pickOnBoundsProperty
设置为false
。
定义当由MouseEvent或contains函数调用触发 时,如何为此节点完成拣选计算。如果pickOnBounds 为true,则通过与此节点的边界相交来计算拾取,否则,拾取通过与此节点的几何形状 相交来计算。
因此,HBox
和VBox
的“透明”区域将不会注册点击事件。
例子:
public class Main extends Application {
@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());
Pane pane = new Pane();
pane.setStyle("-fx-background-color:red;");
StackPane sp = new StackPane();
VBox vbox = new VBox();
HBox hbox = new HBox();
hbox.setSpacing(30);
for (int i = 0; i< 5; i++) {
Button b = new Button("Button");
b.setOnAction(e -> System.out.println("Button clicked"));
hbox.getChildren().add(b);
}
vbox.getChildren().add(hbox);
sp.getChildren().addAll(pane, vbox);
Line line = new Line(10, 10, 500, 10);
line.setStrokeWidth(3);
pane.getChildren().add(line);
line.setOnMouseClicked(e -> {
System.out.println("Line Clicked!");
});
// Set pickOnBounds to vbox and hbox
vbox.setPickOnBounds(false);
hbox.setPickOnBounds(false);
root.setCenter(sp);
primaryStage.setScene(scene);
primaryStage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
答
它们被覆盖导致VBOX在窗格前面。
第一种方式:
可以setVisible(false)
垂直框中,所以面板可以通达,然后setVisible(true)
的垂直框一次。
方式二:
可以使用的方法称为toBack();
和toFront();
并带来了Node
背面或正面的层次:
vBox.toBack(); //the the vBox goes back to the hierarchy,it is like zOrder in html
,然后使用:
vBox.toFront(); //to bring the vBox again in front.
最后:
您可以某处提供ToggleButton
当按下VBox
正在出现,而不是按下时VBox
消失时。
解决我的问题!非常方便和容易的方式。 – FluffyPal