gpt4 book ai didi

JavaFX setGraphic() 不在 MenuItem 中显示图标

转载 作者:行者123 更新时间:2023-11-29 04:42:34 25 4
gpt4 key购买 nike

我的 MenuItem 需要一个图标。

这就像一个“ worker 类”来获取图标的ImageView:

public class IconFactory {

private static ImageView HLP_BOOK_JFX;

public enum ICONS {
BASCET_REMOVE, BASCET_PUT, SAVE, OPEN, ARROW_RIGHT, ARROW_LEFT, ARROW_UP, ARROW_DOWN, CLOCK, ANALOG_SIGNAL, DIGITAL_SIGNAL, REFRESH, GREEN_PLUS, NETWORK, OK, CANCEL, RIGHT_NAV2, LEFT_NAV2, PLAY, PAUSE, LIST_ADD, PAGE_FIND, SET_PARAM, DOWNLOAD, UPLOAD, LOG_FILE, WARNING, INFO, LOG_DIAG, DATA_TRANS, TREE, FILTER, SEARCH, PARAM, ERASE, RESETDEF, RESETDEF2, DEBUG_BUG, INTERNATIONAL, CLOSE, HLP_BOOK
}

public static ImageView getImage(ICONS en) {
switch (en) {
case HLP_BOOK:
if (HLP_BOOK_JFX == null)
HLP_BOOK_JFX = new ImageView(new Image(IconFactory.class.getResourceAsStream("help_book.png")));
return HLP_BOOK_JFX;
}
return null;
}

当我将 myMenuItem.setGraphic(IconFactory.getImage(ICONS.HLP_BOOK)) 用于单个 菜单项时,它完美地工作。

但是,当我想循环生成两个菜单并设置相同的图形时,一个MenuItem没有图标显示。(循环中的第一个下面的代码)。


我的代码:

while (keys.hasMoreElements()) {

// that will do 2 loops, do not care about how

MenuItem subMenuHelp = new MenuItem("MenuItem");
subMenuHelp.setGraphic(IconFactory.getImage(ICONS.HLP_BOOK));
subMenuHelp.setOnAction(new EventHandler<ActionEvent>() {

@Override
public void handle(ActionEvent event) {
// do not care
openHelpFile(link);
}
});
System.out.println(((ImageView) subMenuHelp.getGraphic()).toString());
myMenu.getItems().add(subMenuHelp);
}

如您所见,我添加了一个 System.out.println 以查看是否为当前项设置了图形。控制台中的结果:两行 (MenuItem) 具有相同的 ImageView:

ImageView@79814766[styleClass=image-view]
ImageView@79814766[styleClass=image-view]

我在 Swing 中做了完全相同的事情(但使用了 Icons.setIcons() 函数)并且效果很好。我也一直在寻找一个“重绘”功能来强制显示但没有办法。

希望你能帮助我!

最佳答案

这是因为同一个 Node 不能多次附加到场景图,而且 - 正如您所说的 - 您正在添加相同的 ImageView 对象。

来自documentation of Node :

If a program adds a child node to a Parent (including Group, Region, etc) and that node is already a child of a different Parent or the root of a Scene, the node is automatically (and silently) removed from its former parent.

解决方案是修改 IconFactorygetImage 方法,在每次调用时返回一个新的 ImageView 实例,或者返回 Image 实例而不是 ImageView 实例(我认为第二个更适合名称“IconFactory”)。

您可以存储 Image 实例而不是存储 ImageView 以避免重新加载 Image 本身。您可以查看此问题作为引用:Reusing same ImageView multiple times in the same scene on JavaFX

IconFactory 的可能更新:

public class IconFactory {

private static HashMap<ICON, Image> images = new HashMap<ICON, Image>();

public enum ICON {
BASCET_REMOVE, BASCET_PUT, SAVE, OPEN, ARROW_RIGHT, ARROW_LEFT, ARROW_UP, ARROW_DOWN, CLOCK, ANALOG_SIGNAL, DIGITAL_SIGNAL, REFRESH, GREEN_PLUS, NETWORK, OK, CANCEL, RIGHT_NAV2, LEFT_NAV2, PLAY, PAUSE, LIST_ADD, PAGE_FIND, SET_PARAM, DOWNLOAD, UPLOAD, LOG_FILE, WARNING, INFO, LOG_DIAG, DATA_TRANS, TREE, FILTER, SEARCH, PARAM, ERASE, RESETDEF, RESETDEF2, DEBUG_BUG, INTERNATIONAL, CLOSE, HLP_BOOK
}

public static Image getImage(ICON en) {

if (!images.containsKey(en)) {
switch (en) {
case HLP_BOOK:
images.put(en, new Image(IconFactory.class.getResourceAsStream("help_book.png"))); break;
default:
return null;
}
}
return images.get(en);
}
}

更新后的用法:

subMenuHelp.setGraphic(new ImageView(IconFactory.getImage(ICONS.HLP_BOOK)));

关于JavaFX setGraphic() 不在 MenuItem 中显示图标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38588986/

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