JavaFX:如何使底层节点可访问?

时间:2016-09-17 16:46:56

标签: java layout javafx

我在Pane内有VBoxStackPane。我首先添加了Pane,并在其上添加了VBoxVBox包含几个kes,而这些kes又有Button个孩子。我使用普通Pane作为“画布”来定位LineLine以及Button需要具有互动性。因此,通过点击它们,它们将例如改变它们的颜色。 但目前显示的是Pane及其Line个对象,但它们被VBox覆盖,因此我无法与它们互动,只能与Button进行交互。< / p>

我如何提供我也可以与Line进行互动,尽管它们位于StackPane的较低层?

2 个答案:

答案 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}}(VBoxHBox)设置为false

  

定义如何为此节点执行拣配计算   由MouseEvent或contains函数调用触发。如果pickOnBounds   是的,然后通过与边界相交来计算拾取   此节点,否则通过与几何相交来计算拾取   这个节点的形状。

因此,HBoxVBox的“透明”区域不会注册点击事件。

示例:

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

pickOnBoundsProperty