2016-11-18 1 views
5

schematic자바 FX stackpane

오버레이를 클릭하면, 나는 몇 가지 다른를 포함하는 (두 가지 요소, (다시 캔버스와 상태 표시를 포함)를 BorderPane 다른 stackpane를 포함하는 stackpane이 UI 일들).

녹색 stackpane의 보이지 않는 영역에서 노란 경계선까지 클릭 할 수 있지만 녹색 stackpane (버튼과 같은 클릭 가능한 항목이있는)에서 실제 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

하지만 두 번째 예제에서는 setPickOnBounds (false)를 호출하지 않으므로 제대로 작동하는지 의심 스럽습니다. – mipa

+1

@mipa SSCCE의 아름다움은 물론 그것을 실행하고 볼 수 있다는 것입니다. 두 번째 예제에서는 "위쪽"스택 창을 완전히 생략하므로 마우스 이벤트를 가로 챌 수있는 것이 없지만 여전히 동일한 레이아웃을 얻습니다. 내 요점은 상단의 스택 창은 불필요한 것처럼 보입니다. –

+1

아 - 알겠습니다. 내 잘못. 나는 내가 예제를 실행하지 않았다는 것을 인정한다 :-) – mipa