JavaFX鼠标事件未在嵌套较小画布控件的区域部分中触发

时间:2020-06-02 19:56:44

标签: javafx-11

下面的代码有一个主区域和一个较小的,被覆盖的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"));

没有添加任何代码来消耗鼠标事件。因此,鼠标事件从CenterAreaGridroot都自由冒泡了。

结果类似于添加网格鼠标事件之前的结果。也许以下内容有助于消除歧义。假设我们将屏幕分为9个区域。

  • 0,0保持root(left,top),观察到消息:root,grid
  • 1,0持有root(中,上),观察到的消息:root,grid
  • 2,0保持root(right,top),观察到消息:NONE
  • 0,1保持根(左,中),观察到的消息:根,网格
  • 1,1持有CenterArea(middle,middle),观察到以下消息: 根,网格,中心
  • 2,1保持root(右,中),观察到消息:NONE
  • 0,2保持根(左,下),观察到的消息:无
  • 1,2保持root(中间,底部),观察到的消息:无
  • 2,2保持root(右,下),观察到的消息:无

0 个答案:

没有答案