Icône de l'application JavaFX

172

Est-il possible de changer l'icône de l'application en utilisant JavaFX, ou faut-il le faire avec Swing?

Sebb77
la source

Réponses:

234

En supposant que votre étape est "étape" et que le fichier est sur le système de fichiers:

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

Selon le commentaire ci-dessous, s'il est enveloppé dans un fichier jar contenant, vous devrez utiliser l'approche suivante à la place:

stage.getIcons().add(new Image(<yourclassname>.class.getResourceAsStream("icon.png")));
Michael Berry
la source
5
De plus, si l'icône doit être installée en tant que raccourci d'application et que vous utilisez WebStart comme technologie de déploiement, vous souhaiterez peut-être définir les paramètres d'icône / raccourci / bureau appropriés dans votre fichier jnlp
jewelsea
9
Vous pouvez ajouter plusieurs images de différentes tailles et JavaFX choisira celle qui convient le mieux. Parce que vous avez différentes tailles dans la barre des tâches et différentes dans la barre de titre.
drzymala
11
Je pense que cela ne fonctionne que lorsque le fichier est dans le système de fichiers, pour la situation plus courante où l'icône est enveloppée dans le fichier jar et dans le classpath, cela ne fonctionnait pas pour moi. L'une des autres solutions utilisant stage.getIcons().add( new Image( <yourclassname>.class.getResourceAsStream( "icon.png" )));fonctionne.
k_o_
3
Veuillez noter qu'au moins sur Ubuntu (Unity), l'icône n'est utilisée que pour la décoration de la fenêtre, mais pas pour le lanceur. Pour que l'icône soit visible (au lieu du vilain point d'interrogation), vous devez spécifier le .dektopfichier approprié . Voir ma description ici
dzim
1
cela ne modifie que l'icône sur la barre de titre, c'est-à-dire le côté supérieur gauche de la fenêtre. comment changer l'icône de l'application lorsqu'elle est sur le bureau en tant que raccourci? et sur la barre des tâches?
TejpalBh
74

J'ai essayé cela et cela fonctionne totalement. Le code est:

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

icon.png se trouve dans le même dossier que les fichiers source.

user1736233
la source
3
'<yourclassname> .class' pourrait être remplacé par 'getClass ()'
Jim Fred
71

Programme complet pour les démarreurs :) Ce programme définit l'icône pour 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 de sortie

Capture d'écran JavaFX

Mis à jour pour JavaFX 8

Pas besoin de changer le code. Cela fonctionne toujours bien. Testé et vérifié en Java 1.8 (1.8.0_45). Le chemin peut être défini sur local ou distant, les deux sont pris en charge.

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

OU

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

entrez la description de l'image ici

J'espère que ça aide. Merci!!

Madan Sapkota
la source
Est-ce que cela prend en charge svg?
qed
1
@qed, je ne pense pas que SVG soit pris en charge, mais je ne suis pas sûr à 100%. Vous pouvez le tester.
Madan Sapkota le
J'ai juste essayé d'utiliser un fichier .svg pour l'icône de l'application JavaFX. Cela n'a pas fonctionné. Aucune erreur n'a été fournie, mais JavaFX a utilisé son logo par défaut au lieu de mon logo personnalisé.
Simon Diemert
8

vous pouvez l'ajouter en fxml. Niveau de scène

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

Si vous avez un dossier d'images et que l'icône est enregistrée, utilisez ce

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

et si vous l'utilisez directement depuis votre package, ce qui n'est pas une bonne pratique, utilisez ceci

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

et si vous avez une structure de dossiers et que vous avez votre icône à l'intérieur, utilisez

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

Si votre icon.png est dans le répertoire de ressources et n'oubliez pas de mettre un '/' avant sinon cela ne fonctionnera pas

LazerBanana
la source
2

Que pensez-vous de la création d'un nouveau package ie image.icons dans votre répertoire src et d'y déplacer vos images .png? Il vous suffit d'écrire:

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

Cette solution fonctionne parfaitement pour moi, mais je ne suis toujours pas sûr qu'elle soit correcte (débutant ici).

Dawid
la source
Ce n'est pas une bonne pratique de placer des ressources dans vos packages java. Il est recommandé de les placer dans votre resourcesdossier.
Thibstars
1
stage.getIcons().add(new Image(<yourclassname>.class.getResourceAsStream("/icon.png" )));

Vous pouvez ajouter plus d'une icône avec des tailles différentes en utilisant cette méthode. Les images doivent être de tailles différentes de la même image et la meilleure taille sera choisie. eg. 16x16, 32,32

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

Le dossier images doit se trouver dans le dossier Resource.

PsyhoZOOM
la source
4
Cette réponse est totalement inutile puisqu'une autre réponse expliquait déjà la même chose.
L. Guthardt
1

Vous pouvez facilement mettre une icône dans votre application en utilisant cette ligne de code

stage.getIcons (). add (nouvelle image ("chemin de l'image"));

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

C'est une bonne habitude de créer un dossier images dans votre dossier src et d'en extraire des images.

Harshad Vaghela
la source
Cette réponse est totalement inutile puisqu'une autre réponse expliquait déjà la même chose.
L. Guthardt
0

J'ai utilisé ceci dans mon application

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

Ici, la fenêtre est la scène.

Moishin
la source
0

Si vous exécutez le fichier jar, le code spécifié par Michael Berry changera l'icône dans la barre de titre et dans la barre des tâches. L'icône de raccourci ne peut pas être modifiée.

Si vous exécutez un programme natif compilé avec com.zenjava, vous devez ajouter un lien vers l'icône du programme:

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

Cela ajoutera une icône au raccourci et à la barre des tâches.

Oleksandr Potomkine
la source
0

Activer / désactiver les icônes à l'exécution:

En plus des réponses ici, j'ai trouvé qu'une fois que vous avez attribué une icône à votre application la première fois, vous ne pouvez pas la basculer en ajoutant simplement une nouvelle icône à votre scène (cela serait utile si vous devez basculer l'icône de votre app d'activation / désactivation activée / désactivée).

Pour définir une nouvelle icône pendant l'exécution, utilisez getIcons (). Remove (0) avant d'essayer d'ajouter une nouvelle icône, où 0 est l'index de l'icône que vous souhaitez remplacer, comme illustré ici:

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

Pour accéder à l'étape à partir d'autres méthodes ou classes, vous pouvez créer un nouveau champ statique pour l'étape dans votre classe principale afin de pouvoir y accéder à partir de la méthode start () en encapsulant une méthode statique à laquelle vous pouvez accéder de n'importe où dans votre application .

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")));
    }
}
Israëlm
la source
-1

Si vous avez Invalid URL or resource not foundmis votre icon.png dans le dossier "bin" de votre espace de travail.

Tim113
la source
-2

Un autre moyen simple d'insérer votre propre icône sur la barre de titre de JavaFX consiste à ajouter l'image à votre scène principale en utilisant la méthode suivante:

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

Assurez-vous que votre import javafx.scene.image.Image (si vous utilisez un ide comme netbeans, cela devrait être fait automatiquement pour vous).

Kwesi Aryee
la source
40
n'est-ce pas exactement ce qui a été publié ci-dessus?
XXL
-2

J'ai essayé ceci et cela fonctionne:

stage.getIcons().add(new Image(getClass().getResourceAsStream("../images/icon.png")));
Frank Mmbaga
la source
en fait, .. non: les points ne sont pas pris en charge dans la recherche de ressources, veuillez lire la documentation de l'API
kleopatra