gui - JavaFX Haga clic en superponer stackpane
gui java netbeans (1)
Como puedes ver en el dibujo de arriba, tengo un stackpane que contiene dos elementos, un BorderPane (que de nuevo contiene un lienzo y una barra de estado) y otro stackpane (que contiene algunas otras cosas de UI).
Me gustaría poder hacer clic desde áreas invisibles del panel de distribución verde hasta el borde amarillo, pero aún así permitir hacer clic en elementos reales de la interfaz de usuario en el panel de distribución verde (donde se puede hacer clic en elementos como botones, etc.).
¿Cómo haces esto?
Puedes usar stackPane.setPickOnBounds(false);
. Esto significa que el panel de pila solo se identificará como el objetivo de una acción de mouse si el punto en el que se hizo clic no fuera transparente (en lugar del comportamiento predeterminado, que es identificarlo como el objetivo de la acción del mouse si el mouse el clic está dentro de sus límites).
Aquí hay un 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);
}
}
Tenga en cuenta que el panel de la pila superior parece innecesario, ya que podría simplemente agregar los elementos de la interfaz de usuario que contiene directamente al panel de la pila subyacente. El ejemplo anterior simplemente podría ser reescrito:
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);
}
}