gpt4 book ai didi

java - 将事件处理程序添加到标签中包含的 ImageView

转载 作者:行者123 更新时间:2023-11-29 10:08:56 25 4
gpt4 key购买 nike

我最近开始探索 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));

这是我的自定义标签的样子。

enter image description here

现在我想向 ImageView 添加鼠标单击事件处理程序。这是我处理鼠标点击的代码。

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

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

我做了一些实验,尝试向 customLabel 添加一个 EventHandler。标签能够捕获鼠标点击。

在我看来,我面临这个问题是因为 ImageView 包含在 Label 中。我想知道的是,这是对 JFX 的限制,还是有其他方法可以实现此功能。谢谢。

最佳答案

这似乎是修复 JDK-8117199 的结果. fix将以下内容添加到 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);
}

如您所见,当 Labeled 的图形控件是一个 ImageView它设置为鼠标透明。解决方法是设置 ImageView 的鼠标透明度。回到错误。

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

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


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

Label customLabel = new Label(labelText, new Pane(removeImageView));

这使得图形成为 Pane这意味着特殊 ImageViewupdateChildren() 处理没有发生。

关于java - 将事件处理程序添加到标签中包含的 ImageView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52574852/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com