2014-10-13 15 views
14

Czy istnieje sposób w JavaFX do ustawiania różnych ikon aplikacji dla paska tytułu i paska zadań systemu operacyjnego?JavaFX. Ustaw różne ikony paska tytułu i paska zadań systemu operacyjnego.

Problem polega na tym, że ikona wyświetlana na pasku zadań systemu jest znacznie większa w porównaniu z ikoną na pasku tytułu i nie może zostać prawidłowo dopasowana przez system.

Chciałbym użyć różnych obrazów dla różnych rozmiarów ikon. Podobne do tego, co robisz w pliku .ico.

Po dwukrotnym wywołaniu stage.getIcons().add(...), pierwszy obraz będzie zawsze używany dla obu pasków.

Nie mogłem również użyć istniejącego pliku .ico (który obsługuje różne rozmiary) do tego celu.

+0

Zamiast wywoływać metodę stage.getIcons(). Add() więcej niż raz, Spróbuj ustawić wszystkie obrazy naraz. stage.getIcons(). addAll (Image1, Image2, Image3); –

Odpowiedz

2

Jest sposób, za pomocą dwóch różnych etapów, ale może to mieć problemy (testowane tylko na Windows 7). W poniższym przykładzie użyto języka Java 8/JavaFX 8.

Ten kod ustawia ikonę, która jest wyświetlana na pasku zadań na etapie podstawowym odebranym podczas uruchamiania JavaFX, ale powoduje, że etap jest niewidoczny (przezroczysty, zerowy rozmiar). Następnie otwiera nowe i widoczne okno z inną ikoną.

Ponieważ jest to tylko okno podrzędne, a nie rzeczywiste, wydarzenie ukrywania musi zostać przeniesione na ukryty etap, aby zamknąć aplikację. Może istnieć więcej zdarzeń, które należy delegować, jak minimalizowanie okna.

public class Main extends Application { 
    public static void main(String[] args) { 
     Application.launch(args); 
    } 

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     primaryStage.getIcons().add(getImage("taskbar_icon.png")); 
     primaryStage.initStyle(StageStyle.TRANSPARENT); 
     primaryStage.setWidth(0); 
     primaryStage.setHeight(0); 
     primaryStage.show(); 

     Stage visibleStage = new Stage(); 
     visibleStage.initOwner(primaryStage); 
     visibleStage.getIcons().add(getImage("window_icon.png")); 
     visibleStage.setScene(new Scene(...)); 
     visibleStage.setOnHidden(e -> Platform.runLater(primaryStage::hide)); 
     visibleStage.show(); 
    } 
}