在javaFX中为FileChooser设置应用程序图标

时间:2016-02-08 13:39:56

标签: java javafx-2 fxml

在Windows中的javaFX应用程序中启动FileChooser窗口后,任务栏中的应用程序图标显示了一个java图标,而不是主窗口的图标。是否有可能为FileChooser实例选择应用程序图标?

感谢您的回答!

3 个答案:

答案 0 :(得分:2)

可以这样做,但显然只有当你有一个可见父级时。

如果以下示例中的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窗口代码中的某处解析图标。

答案 1 :(得分:0)

上述解决方案的问题在于,当您使用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);

这将超过文件选择器窗口的主应用程序图标。副作用是,您的文件选择器不会再在任务栏中显示为单独的项目。

为我工作,希望它能帮助到那里的人:)

答案 2 :(得分:0)

这是一个基于RAnders00 answer的丑陋骇客。它会在show调用之前先调用showSaveDialog,再调用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上进行了测试。