簡體   English   中英

在 javaFX 中為 FileChooser 設置應用程序圖標

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM