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);
}
}
Nguồn
2016-11-18 13:28:35
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. –
bản vẽ đẹp! :) –