我在Pane
内有VBox
和StackPane
。我首先添加了Pane
,并在其上添加了VBox
。 VBox
包含几个kes,而这些kes又有Button
个孩子。我使用普通Pane
作为“画布”来定位Line
。 Line
以及Button
需要具有互动性。因此,通过点击它们,它们将例如改变它们的颜色。
但目前显示的是Pane
及其Line
个对象,但它们被VBox
覆盖,因此我无法与它们互动,只能与Button
进行交互。< / p>
我如何提供我也可以与Line
进行互动,尽管它们位于StackPane
的较低层?
答案 0 :(得分:0)
它们被覆盖因为VBOX位于窗格前面。
第一种方式:
您可以setVisible(false)
VBox,以便可以访问窗格,然后再次setVisible(true)
VBox。
第二种方式:
您可以使用名为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
消失。
答案 1 :(得分:0)
您可以将容器Node
的{{3}}(VBox
和HBox
)设置为false
。
定义如何为此节点执行拣配计算 由MouseEvent或contains函数调用触发。如果pickOnBounds 是的,然后通过与边界相交来计算拾取 此节点,否则通过与几何相交来计算拾取 这个节点的形状。
因此,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);
}
}