将EventHandler添加到Label中包含的ImageView

Rit*_*ito 1 java javafx mouseclick-event imageview eventhandler

我最近开始探索Java FX,并希望创建一个自定义标签,里面有一个ImageView.

这是我的自定义标签的代码.

Image image = new Image(getClass().getResourceAsStream("/img/remove.png"), 20, 20, true, true);
ImageView removeImageView = new ImageView(image);

Label customLabel = new Label(labelText, removeImageView);
customLabel.setFont(Font.font("Arial", FontWeight.BOLD, 20));
Run Code Online (Sandbox Code Playgroud)

这就是我的自定义标签的外观.

在此输入图像描述

现在我想将鼠标单击EventHandler添加到ImageView.这是我处理鼠标点击的代码.

removeImageView.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
      @Override
      public void handle(MouseEvent event) {
        System.out.println("Imageview Clicked");
      }
    });
Run Code Online (Sandbox Code Playgroud)

但是当我点击cross图像时,事件没有被捕获.

我试验了一下,并尝试将一个EventHandler添加到customLabel.标签能够捕获鼠标点击.

在我看来,我正面临这个问题,因为ImageView包含在Label中.我想知道的是,这是对JFX的限制还是有任何替代方法来实现此功能.谢谢.

Sla*_*law 6

这似乎是修复JDK-8117199的结果.该修复程序将以下内容添加到LabeledSkinBase#updateChildren():

// RT-19851 Only setMouseTransparent(true) for an ImageView.  This allows the button
// to be picked regardless of the changing images on top of it.
if (graphic instanceof ImageView) {
    graphic.setMouseTransparent(true);
}
Run Code Online (Sandbox Code Playgroud)

如您所见,当Labeled控件的图形为a时,ImageView它被设置为鼠标透明.解决方法是将ImageView后面的鼠标透明度设置为false.

ImageView view = new ImageView();
view.mouseTransparentProperty().addListener((observable, oldVal, newVal) -> {
    if (newVal) {
        view.setMouseTransparent(false);
    }
});
Run Code Online (Sandbox Code Playgroud)

由于您没有使用CSS根据悬停/待命状态更改图像,因此不应导致与错误相关的问题.不过,我会保持谨慎; 以防万一.


@fabian提到的一个更好的解决方法是包装ImageView其他一些Node(例如a Pane).

Label customLabel = new Label(labelText, new Pane(removeImageView));
Run Code Online (Sandbox Code Playgroud)

这使得图形a Pane意味着不会发生特殊ImageView处理updateChildren().