JavaFX-Anwendungssymbol

172

Ist es möglich, das Anwendungssymbol mit JavaFX zu ändern, oder muss dies mit Swing erfolgen?

Sebb77
quelle

Antworten:

234

Angenommen, Ihre Bühne ist "Bühne" und die Datei befindet sich im Dateisystem:

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

Gemäß dem Kommentar unten müssen Sie stattdessen den folgenden Ansatz verwenden, wenn es in ein enthaltendes Glas eingewickelt ist:

stage.getIcons().add(new Image(<yourclassname>.class.getResourceAsStream("icon.png")));
Michael Berry
quelle
5
Wenn das Symbol als Anwendungsverknüpfung installiert werden soll und Sie WebStart als Bereitstellungstechnologie verwenden, möchten Sie möglicherweise die entsprechenden Einstellungen für Symbole / Verknüpfungen / Desktops in Ihrer JNLP-Datei festlegen: docs.oracle.com/javase/7 / Docs / Technotes / Guides / Javaws /…
Jewelsea
9
Sie können mehrere Bilder unterschiedlicher Größe hinzufügen, und JavaFX wählt das Bild aus, das am besten passt. Weil Sie unterschiedliche Größen in der Taskleiste und unterschiedliche in der Titelleiste haben.
Drzymala
11
Ich denke, dies funktioniert nur, wenn sich die Datei im Dateisystem befindet. In der häufigeren Situation, in der das Symbol in die JAR-Datei und in den Klassenpfad eingeschlossen ist, hat dies bei mir nicht funktioniert. Eine der anderen Lösungen mit stage.getIcons().add( new Image( <yourclassname>.class.getResourceAsStream( "icon.png" )));Werken.
k_o_
3
Bitte nicht, dass zumindest unter Ubuntu (Unity) das Symbol nur für die Fensterdekoration verwendet wird, nicht aber für den Launcher. Um das Symbol sichtbar zu machen (anstelle des hässlichen Fragezeichens), müssen Sie die entsprechende .dektopDatei angeben . Siehe meine Beschreibung hier
dzim
1
Dadurch wird nur das Symbol in der Titelleiste geändert, dh oben links im Fenster. Wie ändere ich das Anwendungssymbol, wenn es sich auf dem Desktop als Verknüpfung befindet? und in der Taskleiste?
TejpalBh
74

Ich habe es versucht und es funktioniert total. Der Code lautet:

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

icon.png befindet sich im selben Ordner wie die Quelldateien.

user1736233
quelle
3
'<IhrKlassenname> .Klasse' könnte durch 'getClass ()' ersetzt werden
Jim Fred
71

Vollständiges Programm für den Anfang :) Dieses Programm setzt das Symbol für 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);
    }
}

Screnshot ausgeben

JavaFX-Screenshot

Aktualisiert für JavaFX 8

Der Code muss nicht geändert werden. Es funktioniert immer noch gut. Getestet und verifiziert in Java 1.8 (1.8.0_45). Der Pfad kann auf lokal oder remote eingestellt werden. Beide werden unterstützt.

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

ODER

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

Geben Sie hier die Bildbeschreibung ein

Ich hoffe es hilft. Vielen Dank!!

Madan Sapkota
quelle
Unterstützt dies SVG?
qed
1
@qed, ich glaube nicht, dass SVG unterstützt wird, aber ich bin nicht 100% sicher. Sie können es testen.
Madan Sapkota
Ich habe gerade versucht, eine .svg-Datei für das JavaFX-Anwendungssymbol zu verwenden. Es hat nicht funktioniert. Es wurde kein Fehler angegeben, aber JavaFX verwendete sein Standardlogo anstelle meines benutzerdefinierten.
Simon Diemert
8

Sie können es in fxml hinzufügen. Bühnenebene

<icons>
    <Image url="@../../../my_icon.png"/>
</icons>
Dmitrij Krupa
quelle
7

Wenn Sie einen Bilderordner haben und das Symbol darin gespeichert ist, verwenden Sie diesen

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

und wenn Sie es direkt aus Ihrem Paket verwenden, was keine gute Praxis ist, verwenden Sie dies

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

und wenn Sie eine Ordnerstruktur haben und Ihr Symbol in dieser Verwendung haben

stage.getIcons().add(new Image(<yourclassname>.class.getResourceAsStream("../images/comparison.png")));
Rahul Singh
quelle
2
stage.getIcons().add(new Image(<yourclassname>.class.getResourceAsStream("/icon.png")));

Befindet sich Ihre icon.png im Ressourcenverzeichnis und denken Sie daran, ein '/' einzugeben, bevor dies nicht funktioniert

LazerBanana
quelle
2

Was halten Sie davon, ein neues Paket, dh image.icons, in Ihrem src-Verzeichnis zu erstellen und Ihre .png-Bilder dorthin zu verschieben? Dann müssen Sie nur schreiben:

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

Diese Lösung funktioniert perfekt für mich, aber ich bin mir immer noch nicht sicher, ob sie korrekt ist (Anfänger hier).

Dawid
quelle
Es ist keine gute Praxis, Ressourcen in Ihren Java-Paketen zu platzieren. Es wird empfohlen, sie in Ihrem resourcesOrdner abzulegen.
Thibstars
1
stage.getIcons().add(new Image(<yourclassname>.class.getResourceAsStream("/icon.png" )));

Mit dieser Methode können Sie mehr als ein Symbol mit unterschiedlichen Größen hinzufügen. Die Bilder sollten unterschiedliche Größen desselben Bildes haben und die beste Größe wird ausgewählt. eg. 16x16, 32,32

CTN
quelle
1
stage.getIcons().add(new Image(ClassLoader.getSystemResourceAsStream("images/icon.png")));

Der Bilderordner muss sich im Ressourcenordner befinden.

PsyhoZOOM
quelle
4
Diese Antwort ist völlig unnötig, da eine andere Antwort dies bereits erklärt hat.
L. Guthardt
1

Mit dieser Codezeile können Sie Ihrer Anwendung ganz einfach ein Symbol hinzufügen

stage.getIcons (). add (neues Bild ("Bildpfad"));

Kavinda Pushpitha
quelle
0
stage.getIcons().add(new Image("/images/logo_only.png"));

Es ist eine gute Angewohnheit, einen Bilderordner in Ihrem src-Ordner zu erstellen und Bilder daraus abzurufen.

Harshad Vaghela
quelle
Diese Antwort ist völlig unnötig, da eine andere Antwort dies bereits erklärt hat.
L. Guthardt
0

Ich habe dies in meiner Anwendung verwendet

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

Hier ist das Fenster die Bühne.

Moishin
quelle
0

Wenn Sie die JAR-Datei ausführen, ändert der von Michael Berry angegebene Code das Symbol in der Titelleiste und in der Taskleiste. Das Verknüpfungssymbol kann nicht geändert werden.

Wenn Sie ein mit com.zenjava kompiliertes natives Programm ausführen, müssen Sie dem Programmsymbol einen Link hinzufügen:

<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>

Dadurch wird der Verknüpfung und der Taskleiste ein Symbol hinzugefügt.

Oleksandr Potomkin
quelle
0

Symbole zur Laufzeit umschalten:

Zusätzlich zu den Antworten hier habe ich festgestellt, dass Sie, sobald Sie Ihrer Anwendung zum ersten Mal ein Symbol zugewiesen haben, es nicht mehr umschalten können, indem Sie einfach ein neues Symbol zu Ihrer Bühne hinzufügen (dies wäre hilfreich, wenn Sie das Symbol Ihrer umschalten müssen App von Ein / Aus aktiviert / deaktiviert).

Um ein neues Symbol zur Laufzeit festzulegen, verwenden Sie getIcons (). Remove (0), bevor Sie versuchen, ein neues Symbol hinzuzufügen. Dabei ist 0 der Index des Symbols, das Sie überschreiben möchten, wie hier gezeigt:

//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")));

Um von anderen Methoden oder Klassen auf die Bühne zuzugreifen, können Sie ein neues statisches Feld für die Bühne in Ihrer Hauptklasse erstellen, um von der start () -Methode darauf zugreifen zu können, indem Sie eine statische Methode einkapseln, auf die Sie von überall in Ihrer App zugreifen können .

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
quelle
-1

Wenn Sie Invalid URL or resource not foundIhre icon.png in den Ordner "bin" in Ihrem Arbeitsbereich gestellt haben.

Tim113
quelle
-2

Eine andere einfache Möglichkeit, ein eigenes Symbol in die Titelleiste von JavaFX einzufügen, besteht darin, das Bild mit der folgenden Methode zu Ihrer Primärstufe hinzuzufügen:

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

Stellen Sie sicher, dass Sie javafx.scene.image.Image importieren (wenn Sie eine Idee wie Netbeans verwenden, sollte dies automatisch für Sie erledigt werden).

Kwesi Aryee
quelle
40
Ist das nicht genau das , was oben gepostet wurde?
XXL
-2

Ich habe es versucht und es funktioniert:

stage.getIcons().add(new Image(getClass().getResourceAsStream("../images/icon.png")));
Frank Mmbaga
quelle
eigentlich, .. nein: Punkte werden bei der Ressourcensuche nicht unterstützt, bitte lesen Sie das API-Dokument
Kleopatra