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的限制还是有任何替代方法来实现此功能.谢谢.
这似乎是修复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().