在JavaFX中为整个应用程序窗口设置图标

5

我正在使用JavaFX SDK 11.0.2开发一个大型Java桌面应用程序。在我的应用程序中,我有许多不同的Stage(对应不同的功能)。现在,我想为打开的每个窗口设置图标。虽然我知道如何在一个Stage上设置图标,但我想知道是否有一种方法可以从代码的单个点为应用程序中所有窗口设置单个图标。

  • 是否有全局图标设置,还是我必须在应用程序代码中去设置每一个Stage的图标?
  • 如果我必须为每个Stage设置图标,则是否可以为该图标定义单个Image对象,并将其传递到每个调用Stage.getIcons().add(image);的方法中,或者每次显示一个Stage时都初始化一个新的Image对象?

2
只是针对你提出的问题的第二部分进行评论:javadoc可能会成为你的好帮手 :) - kleopatra
1
你也可以在你的Main类中声明一个静态常量,声明一个getter,并且到处调用这个getter,这就是我正在做的事情。 - Remzi Cavdar
2个回答

4
据我所知,目前没有方便的属性或方法可以自动设置所有阶段具有相同的图标。尽管如此...
在JavaFX 9中,他们添加了Window#getWindows()方法。 JavaFX 8中也有类似的方法,但它是私有API。该方法返回一个可观察列表,其中包含应用程序中显示的每个窗口。换句话说,窗口会随着它们的显示和隐藏而从此列表中添加和删除。您可以利用这个列表。例如:
public static void installIcons(Image... icons) {
  Window.getWindows().addListener((ListChangeListener<Window>) c -> {
    while (c.next()) {
      for (Window window : c.getAddedSubList()) {
        if (window instanceof Stage) {
          ((Stage) window).getIcons().setAll(icons);
        }
      }
    }
  });
}

每次显示舞台时,这将设置舞台的图标为您的图标。不幸的是,它也会设置不需要设置的图标,但这对您的应用程序不应该有任何明显的影响。虽然我想,如果您真的需要,您可以找到一种方法来确保每个舞台只调用一次“setAll(icons)”。
请注意,如果您的所有额外窗口都通过“Dialog”显示,则不需要上述内容。如果设置了“Dialog”的所有者,则它将自动从所有者(如果所有者是“Stage”)获取图标。我不确定这是否是保证行为。还要注意,对话框在幕后使用舞台,至少在桌面上是如此,因此上述代码也将影响对话框。
虽然在上面的示例中这是暗示的,但是回答您的第二个问题是:是的,您可以与每个舞台共享相同的“Image”实例。

到目前为止,我认为这是我问题的唯一最接近的解决方案。非常感谢您的解释。 - Fuzail

0
我没有尝试过,但你可以创建一个属性,并利用 onShowing 事件来定义特定的图标。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接