2016-11-18 12 views
5

schematicJavaFX Nhấp qua bao phủ stackpane

Như bạn có thể thấy trong các bản vẽ ở trên, tôi có một stackpane chứa hai yếu tố, một BorderPane (mà lại chứa vải và statusbar) và stackpane khác (trong đó có một số khác Giao diện người dùng).

Tôi muốn có thể nhấp qua từ các vùng vô hình của ngăn xếp màu xanh lá cây đến đường viền màu vàng nhưng vẫn cho phép nhấp vào giao diện người dùng thực tế trên ngăn xếp màu xanh lá cây (nơi có những thứ có thể nhấp như nút, v.v.).

Bạn làm như thế nào?

+0

Bạn có thực sự cần ngăn xếp màu xanh lá cây không? Có vẻ như bạn sẽ có thể thêm các phần tử giao diện người dùng mà nó chứa trực tiếp vào ngăn ngăn xếp cơ bản. –

+2

bản vẽ đẹp! :) –

Trả lời

6

Bạn có thể sử dụng stackPane.setPickOnBounds(false);. Điều này có nghĩa là ngăn ngăn xếp sẽ chỉ được xác định là đích của hành động chuột nếu điểm mà nó được nhấp vào không trong suốt (thay vì hành vi mặc định, để xác định nó là đích của hành động chuột nếu chuột nhấp vào nằm trong giới hạn của nó).

Dưới đây là một 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 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); 
    } 
} 

Lưu ý rằng ngăn xếp khung đầu dường như không cần thiết, như bạn chỉ có thể thêm các yếu tố giao diện người dùng nó có chứa trực tiếp đến ngăn xếp khung phía dưới. Ví dụ trước có thể được viết lại đơn giản:

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

Nhưng trong ví dụ thứ hai của bạn, bạn không gọi setPickOnBounds (sai), vì vậy tôi nghi ngờ rằng nó sẽ hoạt động. – mipa

+1

@mipa Vẻ đẹp của một SSCCE là, tất nhiên, bạn có thể chạy nó và xem. Trong ví dụ thứ hai, tôi bỏ qua ngăn xếp "phía trên" hoàn toàn, vì vậy không có gì để chặn các sự kiện chuột, nhưng tôi vẫn đạt được cùng một bố cục. Quan điểm của tôi là ngăn xếp trên cùng có vẻ không cần thiết. –

+1

Ahhh - tôi hiểu rồi. Lỗi của tôi. Tôi thừa nhận rằng tôi đã không chạy ví dụ :-) – mipa

Các vấn đề liên quan