JavaFX: How to make a Node partially mouse transparent?

前端 未结 1 1928
礼貌的吻别
礼貌的吻别 2020-12-10 17:01

Simplified Problem:

Make one Node \"A\" that is on top of another Node \"B\" to be half transparent to MouseEvents, so the Events will reach the underlying Node \"

相关标签:
1条回答
  • 2020-12-10 18:02

    Consider the pickOnBounds property, it may help in your situation, but it is not clear to me without seeing your code attempt which fails for the simplified problem.

    node.setPickOnBounds(true)

    If pickOnBounds is true, then picking is computed by intersecting with the bounds of this node, else picking is computed by intersecting with the geometric shape of this node.

    The code below demonstrates how this may be used by creating a square overlaid by an ImageView for an Image which contains tranparent pixels. If pickOnBounds is set to true for the ImageView, then, even if you click on the transparent pixels in the image, the ImageView will receive the mouseClick event. If pickOnBounds is set to false for the ImageView, then, even if you click on the transparent pixels in the image, the ImageView will not process the click and the click event will be received by the node behind the image.

    mousepick

    import javafx.application.Application;
    import javafx.beans.binding.Bindings;
    import javafx.event.EventHandler;
    import javafx.geometry.Pos;
    import javafx.scene.*;
    import javafx.scene.control.*;
    import javafx.scene.image.ImageView;
    import javafx.scene.input.MouseEvent;
    import javafx.scene.layout.*;
    import javafx.scene.paint.*;
    import javafx.scene.shape.Rectangle;
    import javafx.stage.Stage;
    
    public class PickOnBoundsDemo extends Application {
      public static void main(String[] args) { Application.launch(args); }
      @Override public void start(Stage stage) {
        final Rectangle back  = new Rectangle(128, 128);
        back.setFill(Color.FORESTGREEN);
        final ImageView front = new ImageView("http://icons.iconarchive.com/icons/aha-soft/free-large-boss/128/Wizard-icon.png");
        // icon: Linkware (Backlink to http://www.aha-soft.com required)
    
        final StackPane pickArea = new StackPane();
        pickArea.getChildren().addAll(
          back, 
          front
        );
    
        final ToggleButton pickTypeSelection = new ToggleButton("Pick On Bounds");
        final Label pickResult = new Label();
    
        Bindings.bindBidirectional(front.pickOnBoundsProperty(), pickTypeSelection.selectedProperty());
    
        front.setOnMouseClicked(new EventHandler<MouseEvent>() {
          @Override public void handle(MouseEvent t) {
            pickResult.setText("Front clicked");
          }
        });
    
        back.setOnMouseClicked(new EventHandler<MouseEvent>() {
          @Override public void handle(MouseEvent t) {
            pickResult.setText("Back clicked");
          }
        });
    
        VBox layout = new VBox(10);
        layout.setStyle("-fx-background-color: cornsilk; -fx-padding: 10;");
        layout.getChildren().setAll(
          pickArea,
          new Label("Click inside the above area to test mouse picking."),
          pickTypeSelection,
          pickResult
        );
        layout.setAlignment(Pos.CENTER);
    
        stage.setScene(new Scene(layout));
        stage.show();
      }
    }
    
    0 讨论(0)
提交回复
热议问题