3

マウスイベントを処理/前処理したいが、それらを消費してはならないトップデコレーションペインがあります。

これを行う方法?何度か挑戦して失敗しました。

以下は、3 つのペインを持つコードです。緑色のものは「飾り」です。タスクは、マウス イベントに対して透過的にすることです。黄色と青のペインはワーカー ペインです。それらは、緑色のペインに重なっていないかのように機能するはずです。

ただし、緑色のペインはマウス イベントを受け取る必要があります。

コメント行は私が試したことを示し、コメントは何が間違っているかを示します:

import javafx.application.Application;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.event.EventType;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

/**
 * Created by dims on 13.10.2016.
 */
public class DelegateEventsToOverlappedNodes extends Application{


   @Override
   public void start(Stage primaryStage) throws Exception {

      StackPane root = new StackPane();
      root.setBackground(new Background(new BackgroundFill(Color.RED, CornerRadii.EMPTY, Insets.EMPTY)));


      AnchorPane yellowPane = new AnchorPane();
      yellowPane.setBackground(new Background(new BackgroundFill(Color.YELLOW, CornerRadii.EMPTY, Insets.EMPTY)));
      yellowPane.setOnMouseClicked(new EventHandler<MouseEvent>() {
         @Override
         public void handle(MouseEvent event) {
            System.out.println("yellowPane clicked");
         }
      });


      root.getChildren().add(yellowPane);


      Pane bluePane = new Pane();
      bluePane.setBackground(new Background(new BackgroundFill(Color.BLUE, CornerRadii.EMPTY, Insets.EMPTY)));
      bluePane.setOnMouseClicked(new EventHandler<MouseEvent>() {
         @Override
         public void handle(MouseEvent event) {
            System.out.println("bluePane clicked");
         }
      });

      AnchorPane.setLeftAnchor(bluePane, 200.);
      AnchorPane.setRightAnchor(bluePane, 200.);
      AnchorPane.setTopAnchor(bluePane, 200.);
      AnchorPane.setBottomAnchor(bluePane, 200.);


      yellowPane.getChildren().add(bluePane);




      AnchorPane greenPane = new AnchorPane();
      greenPane.setBackground(new Background(new BackgroundFill(Color.rgb(0, 255, 0, 0.9), CornerRadii.EMPTY, Insets.EMPTY)));
      greenPane.setOnMouseClicked(new EventHandler<MouseEvent>() {
         @Override
         public void handle(MouseEvent event) {
            System.out.println("greenPane clicked");
         }
      });


      // greenPane.setVisible(false); // green pane invisible at all

      // greenPane.setMouseTransparent(true); // green clicked doesn't occur

      // greenPane.addEventHandler(Event.ANY, event -> yellowPane.fireEvent(event)); // works for yellow pane, but not for blue sub pane



      root.getChildren().add(greenPane);


      Scene scene = new Scene(root, 800, 600);

      primaryStage.setScene(scene);
      primaryStage.setTitle("DelegateEventsToOverlappedNodes");
      primaryStage.show();

   }

   public static void main(String[] args) {
      DelegateEventsToOverlappedNodes.launch(args);
   }
}
4

1 に答える 1