Ikona aplikacji JavaFX

172

Czy można zmienić ikonę aplikacji za pomocą JavaFX, czy też trzeba to zrobić za pomocą Swinga?

Sebb77
źródło

Odpowiedzi:

234

Zakładając, że Twój etap jest „etapem”, a plik znajduje się w systemie plików:

stage.getIcons().add(new Image("file:icon.png"));

Zgodnie z poniższym komentarzem, jeśli jest zapakowany w zawierający słoik, musisz zamiast tego zastosować następujące podejście:

stage.getIcons().add(new Image(<yourclassname>.class.getResourceAsStream("icon.png")));
Michael Berry
źródło
5
Dodatkowo, jeśli ikona ma zostać zainstalowana jako skrót do aplikacji i używasz WebStart jako technologii wdrażania, możesz chcieć ustawić odpowiednią ikonę / shortcut / desktop settings w pliku jnlp: docs.oracle.com/javase/7 / docs / technotes / Guides / javaws /…
jewelsea
9
Możesz dodać wiele obrazów o różnych rozmiarach, a JavaFX wybierze ten, który najlepiej pasuje. Ponieważ masz różne rozmiary na pasku zadań, a inne na pasku tytułu.
drzymała
11
Myślę, że to działa tylko wtedy, gdy plik znajduje się w systemie plików, w bardziej typowej sytuacji, w której ikona jest zawinięta w pliku jar i w ścieżce klas, to nie działało dla mnie. Jedno z innych rozwiązań wykorzystujących stage.getIcons().add( new Image( <yourclassname>.class.getResourceAsStream( "icon.png" )));działa.
k_o_
3
Proszę nie, przynajmniej w Ubuntu (Unity) ikona jest używana tylko do dekoracji okna, ale nie do programu uruchamiającego. Aby ikona była widoczna (zamiast brzydkiego znaku zapytania), musisz określić odpowiedni .dektopplik. Zobacz mój opis tutaj
dzim
1
zmienia to tylko ikonę na pasku tytułu, tj. w lewym górnym rogu okna. jak zmienić ikonę aplikacji, gdy jest na pulpicie jako skrót? i na pasku zadań?
TejpalBh
74

Próbowałem tego i to całkowicie działa. Kod to:

stage.getIcons().add(
   new Image(
      <yourclassname>.class.getResourceAsStream( "icon.png" ))); 

icon.png znajduje się w tym samym folderze co pliki źródłowe.

user1736233
źródło
3
„<yourclassname> .class” można zastąpić przez „getClass ()”
Jim Fred
71

Pełny program dla początkujących :) Ten program ustawia ikonę dla StackOverflowIcon.

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class StackoverflowIcon extends Application {

    @Override
    public void start(Stage stage) {
        StackPane root = new StackPane();
        // set icon
        stage.getIcons().add(new Image("/path/to/stackoverflow.jpg"));
        stage.setTitle("Wow!! Stackoverflow Icon");
        stage.setScene(new Scene(root, 300, 250));
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

Wyjście Screnshot

Zrzut ekranu JavaFX

Zaktualizowano dla JavaFX 8

Nie ma potrzeby zmiany kodu. Nadal działa dobrze. Przetestowane i zweryfikowane w Javie 1.8 (1.8.0_45). Ścieżka może być ustawiona na lokalną lub zdalną, obsługiwane są oba.

stage.getIcons().add(new Image("/path/to/javaicon.png"));

LUB

stage.getIcons().add(new Image("https://example.com/javaicon.png"));

wprowadź opis obrazu tutaj

Mam nadzieję, że to pomoże. Dzięki!!

Madan Sapkota
źródło
Czy to obsługuje SVG?
zadebiutował
1
@qed, wydaje mi się, że SVG nie jest obsługiwane, ale nie jestem pewien w 100%. Możesz to przetestować.
Madan Sapkota
Właśnie próbowałem użyć pliku .svg dla ikony aplikacji JavaFX. To nie działało. Nie podano żadnego błędu, ale JavaFX użył swojego domyślnego logo zamiast mojego niestandardowego.
Simon Diemert
8

możesz dodać go w fxml. Poziom sceny

<icons>
    <Image url="@../../../my_icon.png"/>
</icons>
Dmitrij Krupa
źródło
7

Jeśli masz folder obrazów i ikona jest w nim zapisana, użyj tego

stage.getIcons().add(new Image(<yourclassname>.class.getResourceAsStream("/images/comparison.png")));

a jeśli używasz go bezpośrednio z pakietu, co nie jest dobrą praktyką, użyj tego

stage.getIcons().add(new Image(<yourclassname>.class.getResourceAsStream("comparison.png")));

a jeśli masz strukturę folderów i masz w niej swoją ikonę

stage.getIcons().add(new Image(<yourclassname>.class.getResourceAsStream("../images/comparison.png")));
Rahul Singh
źródło
2
stage.getIcons().add(new Image(<yourclassname>.class.getResourceAsStream("/icon.png")));

Jeśli twoja ikona.png znajduje się w katalogu zasobów i pamiętaj o wstawieniu „/” przed, w przeciwnym razie nie zadziała

LazerBanana
źródło
2

Co myślisz o utworzeniu nowego pakietu tj. Image.icons w swoim katalogu src i przeniesieniu tam obrazów .png? Wystarczy napisać:

Image image = new Image("/image/icons/nameOfImage.png");
primaryStage.getIcons().add(image);

To rozwiązanie działa u mnie idealnie, ale nadal nie jestem pewien, czy jest poprawne (tutaj początkujący).

Dawid
źródło
Umieszczanie zasobów w pakietach Java nie jest dobrą praktyką. Zaleca się umieszczenie ich w swoim resourcesfolderze.
Thibstars
1
stage.getIcons().add(new Image(<yourclassname>.class.getResourceAsStream("/icon.png" )));

Za pomocą tej metody możesz dodać więcej niż jedną ikonę o różnych rozmiarach. Obrazy powinny mieć różne rozmiary tego samego obrazu, a zostanie wybrany najlepszy rozmiar. eg. 16x16, 32,32

CTN
źródło
1
stage.getIcons().add(new Image(ClassLoader.getSystemResourceAsStream("images/icon.png")));

folder obrazów musi znajdować się w folderze zasobów.

PsyhoZOOM
źródło
4
Ta odpowiedź jest zupełnie niepotrzebna, ponieważ inna odpowiedź już to wyjaśniła.
L. Guthardt
1

Możesz łatwo umieścić ikonę w swojej aplikacji za pomocą tej linii kodu

stage.getIcons (). add (nowy obraz ("ścieżka obrazu"));

Kavinda Pushpitha
źródło
0
stage.getIcons().add(new Image("/images/logo_only.png"));

Dobrym zwyczajem jest tworzenie folderu obrazów w folderze src i pobieranie z niego obrazów.

Harshad Vaghela
źródło
Ta odpowiedź jest zupełnie niepotrzebna, ponieważ inna odpowiedź już to wyjaśniła.
L. Guthardt
0

Użyłem tego w mojej aplikacji

Image icon = new Image(getClass().getResourceAsStream("icon.png"));
window.getIcons().add(icon);

Tutaj okno jest sceną.

Moishin
źródło
0

Jeśli uruchomisz plik jar, kod określony przez Michaela Berry'ego zmieni ikonę na pasku tytułu i na pasku zadań. Nie można zmienić ikony skrótu.

Jeśli uruchamiasz program natywny skompilowany za pomocą com.zenjava, musisz dodać link do ikony programu:

<plugin>
    <groupId>com.zenjava</groupId>
    <artifactId>javafx-maven-plugin</artifactId>
    <version>8.8.3</version>
    <configuration>
    ...
        <bundleArguments>
            <icon>${project.basedir}/src/main/resources/images/filename.ico</icon>
        </bundleArguments>
    </configuration>
</plugin>

Spowoduje to dodanie ikony do skrótu i ​​paska zadań.

Oleksandr Potomkin
źródło
0

Przełącz ikony w czasie wykonywania:

Oprócz odpowiedzi tutaj stwierdziłem, że po przypisaniu ikony do aplikacji po raz pierwszy nie można jej przełączać, po prostu dodając nową ikonę do sceny (byłoby to pomocne, gdybyś musiał zmienić ikonę swojego aplikacja od wł. / wył. włączona / wyłączona).

Aby ustawić nową ikonę w czasie wykonywania, użyj funkcji getIcons (). Remove (0) przed próbą dodania nowej ikony, gdzie 0 to indeks ikony, którą chcesz zastąpić, jak pokazano tutaj:

//Setting icon by first time (You can do this on your start method).
stage.getIcons().add(new Image(getClass().getResourceAsStream("enabled.png")));

//Overriding app icon with a new status (This can be in another method)
stage.getIcons().remove(0);
stage.getIcons().add(new Image(getClass().getResourceAsStream("disabled.png")));

Aby uzyskać dostęp do etapu z innych metod lub klas, możesz utworzyć nowe pole statyczne dla etapu w swojej głównej klasie, aby uzyskać do niego dostęp z metody start () poprzez hermetyzację metody statycznej, do której można uzyskać dostęp z dowolnego miejsca w aplikacji .

public class MainApp extends Application {
    private static Stage stage;
    public static Stage getStage() { return stage; }

    @Override public void start(Stage primaryStage) {
        stage = primaryStage
        stage.getIcons().add(new Image(getClass().getResourceAsStream("enabled.png")));
    }
}

public class AnotherClass {
    public void setStageTitle(String newTitle) {
        MainApp.getStage().setTitle(newTitle);
        MainApp.getStage().getIcons().remove(0);
        MainApp.getStage().getIcons().add(new Image(getClass().getResourceAsStream("disabled.png")));
    }
}
Israelm
źródło
-1

Jeśli Invalid URL or resource not foundumieściłeś swój icon.png w folderze "bin" w twoim obszarze roboczym.

Tim113
źródło
-2

Innym prostym sposobem na wstawienie własnej ikony na pasku tytułu w JavaFX jest dodanie obrazu do głównego stołu montażowego przy użyciu następującej metody:

Image ico = new Image("resources/images/iconLogo.png");
stage.getIcons().add(ico);

Upewnij się, że importujesz javafx.scene.image.Image (jeśli używasz ide, takiego jak netbeans, powinno to być zrobione automatycznie).

Kwesi Aryee
źródło
40
czy to nie jest dokładnie to, co zostało zamieszczone powyżej?
XXL
-2

Spróbowałem tego i działa:

stage.getIcons().add(new Image(getClass().getResourceAsStream("../images/icon.png")));
Frank Mmbaga
źródło
właściwie ... nie: kropki nie są obsługiwane w wyszukiwaniu zasobów, przeczytaj dokumentację API
kleopatra