下面的代码有一个主区域和一个较小的,被覆盖的Canvas
,名称为CenterArea
,颜色为红色。当鼠标位于CenterArea
的底部或右侧边缘之外时,即使仍在主要区域内,鼠标事件也不会触发。
为了演示,我在主“ root”元素和.setOnMouseMoved
中都放置了一个CenterObject
方法。当鼠标悬停在CenterObject
上时,由于未消耗事件,我们将按预期从这两个位置收到通知。
为什么当鼠标位于CenterObject
下方或右侧时,方法不会触发主根区域?
这是一个已知的错误还是我误解了?
下面的代码是使用从gluon下载的javafx-sdk-14.0.1和openjdk 11.0.1一起执行的。我的Windows 10和Ubuntu 18.04系统都出现相同的行为。
public class MouseMoveTest extends Application
{
public static void main(String[] args)
{
Application.launch(args);
}
@Override
public void start(Stage primaryStage)
{
Group root = new Group();
Scene scene = new Scene(root, 500, 200, Color.DARKGREY);
root.setOnMouseMoved(e -> System.out.println("main mouse move"));
CenterArea centerArea = new CenterArea(300, 100);
GridPane grid = new GridPane();
grid.setPadding(new Insets(50, 0, 0, 100));
grid.add(centerArea, 0, 0);
centerArea.setFocusTraversable(true);
root.getChildren().add(grid);
primaryStage.setScene(scene);
primaryStage.show();
}
}
class CenterArea extends Canvas {
private GraphicsContext gc;
public CenterArea(double arg1, double arg2)
{
super(arg1, arg2);
gc = getGraphicsContext2D();
gc.setFill(Color.RED);
gc.fillRect(0, 0, arg1, arg2);
setOnMouseMoved( e -> System.out.println("center mouse move"));
}
}
编辑1:
以下代码行已添加到start
方法中。
grid.setOnMouseMoved( e -> System.out.println("grid mouse move"));
没有添加任何代码来消耗鼠标事件。因此,鼠标事件从CenterArea
到Grid
到root
都自由冒泡了。
结果类似于添加网格鼠标事件之前的结果。也许以下内容有助于消除歧义。假设我们将屏幕分为9个区域。