簡體   English   中英

JavaFX:如何使底層節點可訪問?

[英]JavaFX: How to make the underlaying Node accessable?

我在StackPane有一個Pane和一個VBox 我首先添加了Pane並在其上添加了VBox VBox包括幾個kes,而這些kes又將Button作為孩子。 我使用普通的Pane作為“畫布”來定位Line s。 LineButton需要是交互式的。 因此,通過點擊它們,它們將例如改變它們的顏色。 但是現在顯示了Pane及其Line對象,但它們被VBox覆蓋,因此我無法與它們交互,只能與Button交互。

我怎么能提供我也可以與Line交互,雖然它們位於StackPane的較低層?

它們被覆蓋因為VBOX在Pane前面。

第一種方式:

您可以setVisible(false) VBox,以便可以訪問窗格,然后再次設置VBox可見setVisible(true)

第二種方式:

您可以使用名為toBack();方法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就消失了。

您可以將容器NodeVBoxHBox )的pickOnBoundsProperty設置為false

定義在MouseEvent或contains函數調用觸發時如何為此節點執行拾取計算。 如果pickOnBounds為true,則通過與此節點的邊界相交來計算拾取,否則通過與此節點的幾何形狀相交來計算拾取。

因此, HBoxVBox “透明”區域將不會注冊click事件。

例:

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

在此輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM