java - 在 JavaFX 中为整个应用程序窗口设置图标
问题描述
我一直在使用 JavaFX SDK 11.0.2 开发大型 Java 桌面应用程序。在我的应用程序中,对于不同的功能集,我有许多不同Stage
的(s)。现在,我想在我的应用程序中打开的每个窗口上设置图标。虽然我知道如何在舞台上设置图标,但我想知道是否有一种方法可以从代码中的一个点为我的应用程序中的所有窗口设置一个图标。
- 是否有任何全局图标设置,或者我是否必须在我的应用程序代码的每个阶段设置图标?
- 如果我必须为每个舞台设置图标,那么为图标定义一个
Image
对象并在每次调用中将其传递给Stage.getIcons().add(image);
我是否应该在每次显示舞台时只初始化一个 Image 对象?
解决方案
据我所知,没有方便的属性或方法可以设置,以便所有阶段自动具有相同的图标。那就是说...
在 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
则不需要上述内容。如果您设置 a 的所有者,Dialog
它将自动从所有者那里获取图标(如果所有者是 a Stage
)。我不确定这是否是有保证的行为。另请注意,对话框使用幕后舞台,至少在桌面上,因此上述代码也会影响对话框。
尽管在上面的示例中暗示了这一点,但第二个问题的答案是:是的,您可以Image
与每个阶段共享同一个实例。
推荐阅读
- ruby-on-rails - 包括 RailsAdmin 组中的所有剩余字段
- ios - 在 Firebase Crashlytics 仪表板中加载您的问题时出现 iOS 错误
- cmake - 将 fixup_bundle 结果添加到 CPack
- c - 如果可能,需要有关以下代码输出的帮助并进行解释
- python - 将后视模式与匹配的正则表达式搜索模式分组以作为一个整体替换
- android - 为密度拆分 apk:不支持 Galaxy S8+、Note 8、Galaxy S9+、Note 9
- javascript - AbortError - 使用 WebRTC 进行屏幕共享
- javascript - 无法在 Select 中加载 defaultProptypes - Ant Design
- pandas - 在多个 csv 文件中插入和重命名列并合并为一个 csv
- docker - 编译后的 Thrift bin 文件很大