2014-07-03 51 views
8

我試圖創建一個沒有出現在Windows任務欄上並且未修飾的階段(沒有邊框,也沒有關閉/最小化/最大化按鈕)。我的最終目標是創建一個將彈出通知窗口的托盤圖標應用程序。JavaFX:你能創建一個不顯示在任務欄上並且未修飾的舞臺嗎?

它與此question類似,我希望StageStyle.UTILITY(防止任務欄上顯示舞臺)和StageStyle.TRANSPARENT(它是完全未修飾的窗口)的行爲。

引用的問題對我來說不起作用,因爲我沒有從中創建模態窗口的父級。任何想法如何讓這個工作?由於

回答

10

我能夠解決此問題與下面的代碼:

Stage stage = new Stage(); 

    stage.initStyle(StageStyle.UTILITY); 
    stage.setMaxHeight(0); 
    stage.setMaxWidth(0); 
    stage.setX(Double.MAX_VALUE); 

StageStyle。實用程序將避免創建任務欄圖標。我將寬度和高度設置爲0,使窗口變小,然後使用stage.setX(Double.MAX_VALUE)將它放在遠離屏幕的位置,以使其不顯示。這有點麻煩,但它似乎工作正常。

+0

我嘗試使用initStyle(StageStyle.UTILITY)被證明的階段之後,它不可能。任何想法如何做到這一點? (起初我需要屏幕和任務欄中的舞臺,但是我希望它可以在視覺上顯示出來)。 – theexplorer

+0

@theexplorer根據[文檔](http://docs.oracle.com/javase/8/javafx/api/javafx/stage/Stage.html#initStyle-javafx.stage.StageStyle-),必須先調用initStyle舞臺是可見的。不知道是否有辦法解決它。 – dejuknow

6

JavaFX的不支持該功能,您請求

只使用核心Java 8類你不能做你的要求(不顯示未修飾的或透明的階段任務欄圖標)。

如果您願意,請在JavaFX issue tracker中爲此提出功能請求。

您可以編寫一些本機JNI code,並告訴Windows不要爲您的應用程序顯示任務欄圖標。我不知道你會怎麼做。


建議在任務欄圖標

我認爲這是相當標準的窗口工具包的行爲,顯示在任務欄中的應用程序主窗口時不隱藏在主應用程序窗口,所以我建議不要試圖規避這種標準行爲。

建議的通知和托盤圖標

這是不直接關係到你的問題的標題,但只是在執行任務的最終目標發表評論 - 通知托盤圖標。

當與托盤圖標關聯的窗口被隱藏時,我所看到的大多數托盤應用程序都沒有任務欄圖標,但是當顯示與托盤圖標關聯的窗口時,確實有任務欄圖標 - 所以我建議你堅持使用該設置。

另外,通知是系統托盤圖標基礎結構本身的標準部分,所以我建議您使用系統托盤圖標通知的標準機制,而不是使用自己的標準機制。這也將允許用戶配置托盤圖標及其通知是否使用標準OS托盤圖標和通知管理UI顯示。

我創建了一個sample application,它使用AWT SystemTray API爲JavaFX應用程序提供系統托盤,該應用程序使用本節中的部分建議。如果你喜歡,你可以試試看。

當實現RT-17503 Provide system tray support時,系統托盤支持將提供給JavaFX(可能使用Java 9)。

0

JavaFX DOES支持。

不要把main()方法放在你的Application類中。只要創建另一個類是主類:

public class FxApplication extends Application { 

} 

public class Main { 
    public static void main(String[] args) { 
    PlatformImpl.setTaskbarApplication(false); 
    Application.launch(FxApplication.class, args); 
    } 
} 
+3

在Win7上它仍然顯示在任務欄中。另外,setTaskbarApplication()不是API。所以對於Java 9來說,這個代碼無論如何都不起作用。 – Roland

0

這個問題是不是真新鮮,但我有同樣的問題,並沒有發現解決方案在第一,但這裏是我的解決辦法:)

最好我找到的解決方案是將primaryStage設置爲樣式實用程序,並將所有childStages設置爲Style Undecorated。然後primaryStage的不透明度設置爲0.0,以便其不可見: PrimaryStage:

primaryStage.initStyle(StageStyle.UTILITY); 
primaryStage.setOpacity(0); 
primaryStage.show(); 

柴爾茲:

this.initOwner(owner); 
this.initStyle(StageStyle.UNDECORATED); 
相關問題