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

问题描述:

我在StackPane内有PaneVBox。我首先添加了Pane,并在其上添加了VBoxVBox包括几个kes,它们又有小孩Buttons。我使用正常的Pane作为“画布”来定位LineLine以及Button需要互动。因此,通过点击它们,它们将例如改变它们的颜色。 但目前Pane及其Line对象显示,但它们覆盖VBox所以我不能与他们互动,但只有与Button s。JavaFX:如何使下层节点可访问?

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

您可以将容器Node S(VBoxHBox)的pickOnBoundsProperty设置为false

定义当由MouseEvent或contains函数调用触发 时,如何为此节点完成拣选计算。如果pickOnBounds 为true,则通过与此节点的边界相交来计算拾取,否则,拾取通过与此节点的几何形状 相交来计算。

因此,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); 
    } 
} 

enter image description here

+0

解决我的问题!非常方便和容易的方式。 – FluffyPal

它们被覆盖导致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消失时。