你的問題還不清楚,但nontheless,如果它可以幫助你:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
// the magic: use setPickOnBounds(false);
public class LayersWithMouseEvents extends Application {
@Override
public void start(Stage primaryStage) {
// root
StackPane root = new StackPane();
// layers
Pane bottomLayer = new Pane();
Pane topLayer = new Pane();
// bottom: layer1, top: layer2
root.getChildren().addAll(bottomLayer, topLayer);
// layer 1 objects
Rectangle rectangle = new Rectangle(100,100,100,100);
rectangle.setFill(Color.GREEN);
rectangle.setOnMousePressed(e -> System.out.println("Rectangle 0: " + e));
bottomLayer.getChildren().add(rectangle);
// layer 2 objects
rectangle = new Rectangle(50,50,50,50);
rectangle.setFill(Color.RED);
rectangle.setOnMousePressed(e -> System.out.println("Rectangle 1: " + e));
topLayer.getChildren().add(rectangle);
rectangle = new Rectangle(125,125,50,50);
rectangle.setFill(Color.RED);
rectangle.setOnMousePressed(e -> System.out.println("Rectangle 2: " + e));
topLayer.getChildren().add(rectangle);
rectangle = new Rectangle(200,200,50,50);
rectangle.setFill(Color.RED);
rectangle.setOnMousePressed(e -> System.out.println("Rectangle 3: " + e));
topLayer.getChildren().add(rectangle);
// layer 1 event handler
bottomLayer.setOnMousePressed(e -> System.out.println("Layer 1: " + e));
// layer 2 event handler
topLayer.setOnMousePressed(e -> System.out.println("Layer 2: " + e));
// this is the magic that allows you to click on the layer1 object event though layer 2 is on top of layer 1
// but ONLY(!) as long as the layer is transparent. if you add e. g. this it won't work anymore to click through to layer 1:
// layer2.setStyle("-fx-background-color:yellow");
topLayer.setPickOnBounds(false);
primaryStage.setScene(new Scene(root, 800, 600));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
另一個例子是將監聽器添加到父,E。 G。現場,檢查事件的目標是這樣的:
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
public class LayersWithMouseEvents2 extends Application {
@Override
public void start(Stage primaryStage) {
Rectangle rectangle = new Rectangle(100,100,100,100);
rectangle.setFill(Color.GREEN);
HBox hBox = new HBox();
hBox.setPrefSize(200, 200);
hBox.setStyle("-fx-background-color:yellow");
hBox.getChildren().add(rectangle);
Group root = new Group();
root.getChildren().add(hBox);
primaryStage.setScene(new Scene(root, 800, 600));
primaryStage.show();
primaryStage.getScene().setOnMousePressed(e -> System.out.println("Scene: " + e));
}
public static void main(String[] args) {
launch(args);
}
}
根據你點擊你:
Scene: MouseEvent [source = [email protected], target = [email protected], eventType = MOUSE_PRESSED, consumed = false, x = 295.0, y = 134.0, z = 0.0, button = PRIMARY, primaryButtonDown, pickResult = PickResult [node = null, point = Point3D [x = 295.0, y = 134.0, z = 0.0], distance = 1119.6152422706632]
Scene: MouseEvent [source = [email protected], target = [email protected], eventType = MOUSE_PRESSED, consumed = false, x = 148.0, y = 134.0, z = 0.0, button = PRIMARY, primaryButtonDown, pickResult = PickResult [node = [email protected], point = Point3D [x = 148.0, y = 134.0, z = 0.0], distance = 1119.6152422706632]
Scene: MouseEvent [source = [email protected], target = Rectangle[x=100.0, y=100.0, width=100.0, height=100.0, fill=0x008000ff], eventType = MOUSE_PRESSED, consumed = false, x = 52.0, y = 54.0, z = 0.0, button = PRIMARY, primaryButtonDown, pickResult = PickResult [node = Rectangle[x=100.0, y=100.0, width=100.0, height=100.0, fill=0x008000ff], point = Point3D [x = 152.0, y = 154.0, z = 0.0], distance = 1119.6152422706632]
而且隨着知名度切換也可能是這樣的:
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
public class LayersWithMouseEvents2 extends Application {
boolean hBoxVisible = true;
@Override
public void start(Stage primaryStage) {
Rectangle rectangle = new Rectangle(100,100,100,100);
rectangle.setFill(Color.GREEN);
HBox hBox = new HBox();
hBox.setPrefSize(200, 200);
hBox.setStyle("-fx-background-color:yellow");
hBox.getChildren().add(rectangle);
Group root = new Group();
root.getChildren().add(hBox);
Scene scene = new Scene(root, 800, 600);
scene.setOnMousePressed(e -> {
System.out.println("Scene: " + e);
if(e.getTarget() == hBox) {
System.out.println("HBox clicked");
}
if(e.getTarget() == rectangle) {
System.out.println("Rectangle clicked");
}
if(e.getTarget() == scene) {
System.out.println("Scene clicked");
hBoxVisible = !hBoxVisible;
hBox.setVisible(hBoxVisible);}
});
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
剛向每個子節點註冊不同的處理程序。也許這將有助於發佈一些代碼。 –
我已經爲父母(組)和一個爲孩子(HBox)註冊了兩個處理程序,問題是所有東西都被第一個(一個鏈接到組)所捕獲...... – navy1978
發佈[MCVE]。沒有代碼示例就很難(也許不可能)知道發生了什麼問題。 –