Fuz*_*ail 5 java desktop-application javafx
我一直在使用 JavaFX SDK 11.0.2 开发一个大型 Java 桌面应用程序。在我的应用程序中,我有许多不同的Stage功能用于不同的功能集。现在,我想在应用程序中打开的每个窗口上设置图标。虽然我知道如何在舞台上设置图标,但我想知道是否有一种方法可以从代码中的单个点为应用程序中的所有窗口设置单个图标。
Image如果我必须为每个 Stage 设置图标,那么为图标定义一个对象并将其传递到每次调用中是否可以Stage.getIcons().add(image);,或者我应该在每次显示 Stage 时初始化一个 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);
}
}
}
});
}
Run Code Online (Sandbox Code Playgroud)
每次显示时,这都会将舞台的图标设置为您的图标。不幸的是,它还会设置不需要设置的图标,但这不会对您的应用程序产生任何明显的影响。尽管我认为您可以找到一种方法来确保setAll(icons)如果确实需要的话每个阶段只调用一次。
请注意,如果所有额外的窗口都通过显示Dialog,那么您不需要上述内容。如果您设置 a 的所有者,Dialog它将自动从所有者那里获取图标(如果所有者是 a Stage)。我不确定这是否是有保证的行为。另请注意,对话框在后台使用一个阶段,至少在桌面上如此,因此上述代码也会影响对话框。
虽然上面的示例暗示了这一点,但第二个问题的答案是:是的,您可以Image与每个阶段共享同一个实例。