[英]Set application icon for FileChooser in javaFX
在 windows 中的 javaFX 应用程序中启动 FileChooser 窗口后,任务栏中的应用程序图标显示一个 java 图标,而不是主窗口的图标。 是否可以为 FileChooser 实例选择应用程序图标?
感谢您的回答!
这样做是可能的,但显然只有当您有一个可见的父阶段时。
如果以下示例中的stage
可见,您可以执行以下操作:
stage.getIcons().add(new Image("http://i.imgur.com/1M3UaZy.png"));
FileChooser fileChooser = new FileChooser();
File result = fileChooser.showSaveDialog(stage);
这将打开文件选择器作为给定阶段的子级,它具有给定的图标。
我使用调试器(Windows x64 上的 Oracle Java 8u72)逐步浏览了 JavaFX 源代码,并且 Java 代码中没有可以设置图标的单点。 父窗口句柄被传递到本机方法中,然后图标可能会在 Win32 窗口代码中的某处解析。
上述解决方案的问题是,当您使用 FXML 控制器时,它无法开箱即用。 这让我困扰了一段时间,但最终我找到了解决方案,我想与您分享。
首先,您需要为 fxml 文件中的最顶层窗格分配一个 id,例如:
<AnchorPane prefHeight="563.0" prefWidth="442.0" scaleShape="false" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:id="primaryStageAnchorPane" fx:controller="application.MyController">
现在您可以在控制器中使用此 ID 来创建链接:
@FXML
private AnchorPane primaryStageAnchorPane;
这就是困难的部分。 您现在需要做的就是获取链接窗格的窗口属性(这些属性来自应用程序文件的初级阶段):
Stage stage = (Stage) primaryStageAnchorPane.getScene().getWindow();
FileChooser fileChooser = new FileChooser();
File tempFolder = fileChooser.showOpenDialog(stage);
这将取代文件选择器窗口的主应用程序图标。 作为副作用,您的文件选择器将不再作为单独的项目出现在任务栏中。
为我工作,希望它可以帮助那里的人:)
这是基于RAnders00 answer的丑陋黑客。 它在showSaveDialog
调用之前调用show
,另外它调用stage.initStyle(StageStyle.UNDECORATED)
所以我们不会得到一个不需要的窗口。
此外,它只能使用资源图标,而不是 url 示例图标。
// For me it only worked with resource icons, nor url example icon
stage.getIcons().add(new Image(getClass().getClassLoader().getResourceAsStream("icon.png")));
FileChooser fileChooser = new FileChooser();
// App icon show hack
stage.initStyle(StageStyle.UNDECORATED); // Remove unwanted window (no buttons no window)
stage.show();
File result = fileChooser.showSaveDialog(stage);
// Close app icon
stage.hide();
仅在 Windows 10 上测试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.