2016-11-18 5 views
5

schematicJavaFXのstackpane

を重ねてクリックして、私はいくつかの他が含まれている(2つの要素(再びキャンバスとステータスバーが含まれています)BorderPaneと別のstackpaneを含むstackpaneを持っていますUIの事柄)。

緑色のスタックペインの目に見えない領域から黄色の境界線までクリックしても、緑色のスタックパネル(ボタンなどのクリック可能なものなど)上の実際のUIのものをクリックできるようにしたいと考えています。

どうすればよいですか?

+0

本当に緑色のスタックペインが必要ですか?基本的なスタックペインに直接含まれるUI要素を追加できるように思えます。 –

+2

素敵なドローイング! :) –

答えて

6

stackPane.setPickOnBounds(false);を使用できます。これは、スタックペインが、クリックされたポイントが透明ではない場合(マウス操作のターゲットとして識別するためのデフォルトの動作ではなく)、マウス操作のターゲットとしてのみ識別されることを意味しますクリックはその範囲内にあります)。あなたは、単にそれが根底にあるスタックペインに直接含まれているUI要素を追加することができますように、上部スタックペインには、不要と思われることを

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.canvas.Canvas; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 

public class ClickThroughStackPane extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     Canvas canvas = new Canvas(400,400); 
     canvas.setOnMouseClicked(e -> System.out.println("Mouse click: canvas")); 
     HBox statusBar = new HBox(new Label("Status")); 
     statusBar.setOnMouseClicked(e -> System.out.println("Mouse click: statusBar")); 
     BorderPane borderPane = new BorderPane(canvas, statusBar, null, null, null); 

     Button button = new Button("Click"); 
     button.setOnAction(e -> System.out.println("Button pressed")); 
     StackPane stack = new StackPane(button); 

     stack.setPickOnBounds(false); 

     StackPane root = new StackPane(borderPane, stack); 
     primaryStage.setScene(new Scene(root)); 
     primaryStage.show(); 
    } 

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

注:ここでは

はSSCCEです。前の例は簡単に書き直すことができます:

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.canvas.Canvas; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 

public class ClickThroughStackPane extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     Canvas canvas = new Canvas(400,400); 
     canvas.setOnMouseClicked(e -> System.out.println("Mouse click: canvas")); 
     HBox statusBar = new HBox(new Label("Status")); 
     statusBar.setOnMouseClicked(e -> System.out.println("Mouse click: statusBar")); 
     BorderPane borderPane = new BorderPane(canvas, statusBar, null, null, null); 

     Button button = new Button("Click"); 
     button.setOnAction(e -> System.out.println("Button pressed")); 

     StackPane root = new StackPane(borderPane, button); 
     primaryStage.setScene(new Scene(root)); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

しかし、あなたの2番目の例ではsetPickOnBounds(false)を呼び出さないので、うまくいくとは思えません。 – mipa

+1

@mipa SSCCEの美しさは、もちろん、それを実行して見ることができるということです。 2番目の例では、「上部」のスタックペインを完全に省略しているため、マウスイベントをインターセプトするものはありませんが、同じレイアウトを実現しています。私の指摘は、スタックの上部の枠が不要と思われることです。 –

+1

ああ - そうです。私のせい。私は例を実行しなかったことを認めます:-) – mipa

関連する問題