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

Set Icon For Overall Application Windows In JavaFX

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

我没试过这个,但你可以有一个 属性 并使用 Stage onShowing 事件来定义特定的图标。

据我所知,没有方便的属性或方法可以设置所有阶段自动具有相同的图标。也就是说...

在 JavaFX 9 中,他们添加了 Window#getWindows() 方法。 JavaFX 8 中有一个类似的方法,但它是私有的 API。该方法 returns 一个包含应用程序中显示的每个 window 的可观察列表。换句话说,windows 在显示和隐藏时分别从该列表中添加和删除。你可以利用这个。例如:

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) 如果你真的需要的话。

请注意,如果您所有额外的 windows 都通过 Dialog 显示,那么您就不需要以上内容。如果您设置 Dialog 的所有者,它将自动从所有者那里获取图标(如果所有者是 Stage)。我不确定这是否是有保证的行为。另请注意,对话框使用后台阶段,至少在桌面上如此,因此上述代码也会影响对话框。

虽然上面的示例暗示了这一点,但您第二个问题的答案是:是的,您可以在每个阶段共享相同的 Image 实例。