7

簡略化された問題:

別のノード「B」の上にある 1 つのノード「A」を、MouseEvents に対して半分透明にすることで、イベントが下層のノード「B」に到達するようにします。両方のノードは同じサイズですが、ノード「A」の背景画像は半分透明なので、ノード「B」の半分が表示されます。

本当の問題:

タブのメニューがあります。各タブをドラッグして、対応するメニュー レイヤーを展開できます。したがって、各タブ レイヤーは、部分的に透明な背景 (基本的にはポリゴン) を持つペインであり、その透明な部分は MouseEvents に対しても透明である必要があります。

図(まだ投稿できません。リンクを参照してください:タブの図、濃い緑色の線は緑色のペインの境界線です)は基本的な原則を示しています:タブのみが表示され、レイヤー自体を引っ張ることができると想像してくださいその内容を閲覧する権利。

問題は、Node 全体を透明にせずに、Node の領域を MouseEvents に対して透明にするにはどうすればよいかということです。

ご協力ありがとうございました!

アップデート:

簡単な問題を明確にするために、対応するコードを次に示します。

//Create parent group
Group root = new Group();

//Create linear gradient, so one side is transparent
Stop[] stops = new Stop[] { new Stop(0, Color.rgb(0, 255, 0, 0.0)), new Stop(1, Color.rgb(0, 255, 0, 1.0))};
LinearGradient lg1 = new LinearGradient(0, 0, 1, 0, true, CycleMethod.NO_CYCLE, stops);

//Create the rectangles
Rectangle A = new Rectangle(100, 50, lg1);
Rectangle B = new Rectangle(100,50, Color.RED);

//Add eventHandlers
A.setOnMouseClicked(new EventHandler<MouseEvent>() {
    @Override
    public void handle(MouseEvent e) {
        System.out.println("Clicked A");
    }
});
B.setOnMouseClicked(new EventHandler<MouseEvent>() {
    @Override
    public void handle(MouseEvent e) {
        System.out.println("Clicked B");
    }
});
root.getChildren().addAll(B, A);

//Add to Scene..

お役に立てれば。

4

1 に答える 1

11

pickOnBoundsプロパティを検討してください。状況に役立つ可能性がありますが、単純化された問題で失敗するコードの試行を確認しないと、私にはわかりません。

node.setPickOnBounds(true)

pickOnBoundsがtrueの場合、ピッキングはこのノードの境界と交差することによって計算されます。そうでない場合、ピッキングはこのノードの幾何学的形状と交差することによって計算されます。

以下のコードは、透明なピクセルを含むImageViewforでオーバーレイされた正方形を作成することにより、これをどのように使用できるかを示しています。ImageImageViewのがtrueに設定されている場合pickOnBounds、画像内の透明なピクセルをクリックしても、ImageViewはmouseClickイベントを受け取ります。ImageViewのがfalseに設定されている場合pickOnBounds、画像内の透明なピクセルをクリックしても、ImageViewはクリックを処理せず、クリックイベントは画像の背後にあるノードによって受信されます。

マウスピック

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();
  }
}
于 2013-03-20T21:07:46.997 に答える