Icono de la aplicación JavaFX

Respuestas:

234

Asumiendo que su etapa es "etapa" y el archivo está en el sistema de archivos:

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

Según el comentario a continuación, si está envuelto en un frasco contenedor, deberá utilizar el siguiente enfoque:

stage.getIcons().add(new Image(<yourclassname>.class.getResourceAsStream("icon.png")));
Michael Berry
fuente
55
Además, si el ícono se instalará como un acceso directo a la aplicación y está utilizando WebStart como tecnología de implementación, es posible que desee establecer la configuración apropiada de ícono / acceso directo / escritorio en su archivo jnlp
jewelsea
9
Puede agregar varias imágenes de diferentes tamaños y JavaFX elegirá la que mejor se ajuste. Porque tiene diferentes tamaños en la barra de tareas y diferentes en la barra de título.
drzymala
11
Creo que esto solo funciona cuando el archivo está en el sistema de archivos, para la situación más común en la que el icono está envuelto dentro del archivo jar y en el classpath, esto no funcionaba para mí. Una de las otras soluciones que utilizan stage.getIcons().add( new Image( <yourclassname>.class.getResourceAsStream( "icon.png" )));obras.
k_o_
3
Por favor, no, que al menos en Ubuntu (Unity) el icono solo se usa para la decoración de la ventana, pero no para el iniciador. Para tener el icono visible (en lugar del signo de interrogación feo), necesitará especificar el .dektoparchivo apropiado . Vea mi descripción aquí
dzim
1
esto cambia solo el icono en la barra de título, es decir, el lado superior izquierdo de la ventana. ¿Cómo cambiar el icono de la aplicación cuando está en el escritorio como acceso directo? y en la barra de tareas?
TejpalBh
74

Intenté esto y funciona totalmente. El codigo es:

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

icon.png está en la misma carpeta que los archivos de origen.

usuario1736233
fuente
3
'<nombreclases> .class' podría reemplazarse por 'getClass ()'
Jim Fred
71

Programa completo para principiantes :) Este programa establece un icono para 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);
    }
}

Salida Screnshot

Captura de pantalla de JavaFX

Actualizado para JavaFX 8

No es necesario cambiar el código. Aún funciona bien. Probado y verificado en Java 1.8 (1.8.0_45). La ruta se puede establecer en local o remota, ambos son compatibles.

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

O

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

ingrese la descripción de la imagen aquí

Espero eso ayude. ¡¡Gracias!!

Madan Sapkota
fuente
¿Esto soporta svg?
qed
1
@qed, no creo que SVG sea compatible, pero no estoy 100% seguro. Puedes probarlo.
Madan Sapkota
Acabo de intentar usar un archivo .svg para el icono de la aplicación JavaFX. No funcionó. No se proporcionó ningún error, pero JavaFX utilizó su logotipo predeterminado en lugar del personalizado.
Simon Diemert
8

puedes agregarlo en fxml. Nivel de etapa

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

Si tiene una carpeta de imágenes y el icono está guardado en ese, use esto

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

y si lo está utilizando directamente desde su paquete, lo cual no es una buena práctica, use esto

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

y si tiene una estructura de carpetas y tiene su icono dentro de ese uso

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

Si su icon.png está en el directorio de recursos y recuerde poner un '/' antes, de lo contrario no funcionará

LazerBanana
fuente
2

¿Qué piensas acerca de crear un nuevo paquete, es decir, image.icons en tu directorio src y mover allí tus imágenes .png? Entonces solo necesitas escribir:

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

Esta solución me funciona perfectamente, pero aún no estoy seguro de si es correcta (principiante aquí).

Dawid
fuente
No es una buena práctica colocar recursos en sus paquetes de Java. Se recomienda colocarlos en su resourcescarpeta.
Thibstars
1
stage.getIcons().add(new Image(<yourclassname>.class.getResourceAsStream("/icon.png" )));

Puede agregar más de un icono con diferentes tamaños utilizando este método. Las imágenes deben tener diferentes tamaños de la misma imagen y se elegirá el mejor tamaño. eg. 16x16, 32,32

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

La carpeta de imágenes debe estar en la carpeta de recursos.

PsyhoZOOM
fuente
44
Esta respuesta es completamente innecesaria ya que otra respuesta ya explicó lo mismo.
L. Guthardt el
1

Puede poner fácilmente el icono a su aplicación usando esta línea de código

stage.getIcons (). add (nueva imagen ("ruta de imagen"));

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

Es una buena costumbre hacer una carpeta de imágenes en su carpeta src y obtener imágenes de ella.

Harshad Vaghela
fuente
Esta respuesta es completamente innecesaria ya que otra respuesta ya explicó lo mismo.
L. Guthardt el
0

Usé esto en mi aplicación

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

Aquí la ventana es el escenario.

Moishin
fuente
0

Si ejecuta el archivo jar, el código especificado por Michael Berry cambiará el icono en la barra de título y en la barra de tareas. El icono de acceso directo no se puede cambiar.

Si ejecuta un programa nativo compilado con com.zenjava, debe agregar un enlace al icono del programa:

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

Esto agregará un ícono al atajo y la barra de tareas.

Oleksandr Potomkin
fuente
0

Alternar iconos en tiempo de ejecución:

Además de las respuestas aquí, descubrí que una vez que ha asignado un ícono a su aplicación por primera vez, no puede alternarlo simplemente agregando un nuevo ícono a su escenario (esto sería útil si necesita alternar el ícono de su aplicación de encendido / apagado habilitado / deshabilitado).

Para establecer un nuevo ícono durante el tiempo de ejecución, use getIcons (). Remove (0) antes de intentar agregar un nuevo ícono, donde 0 es el índice del ícono que desea anular, como se muestra aquí:

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

Para acceder al escenario desde otros métodos o clases, puede crear un nuevo campo estático para el escenario en su clase principal, por lo que puede acceder desde el método start () encapsulando un método estático al que puede acceder desde cualquier lugar de su aplicación .

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

Si tienes, Invalid URL or resource not foundpon tu icon.png en la carpeta "bin" en tu espacio de trabajo.

Tim113
fuente
-2

Otra manera fácil de insertar su propio icono en la barra de título en JavaFX es agregar la imagen a su etapa principal utilizando el siguiente método:

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

Asegúrese de importar javafx.scene.image.Image (si usa un ide como netbeans, esto debería hacerse automáticamente por usted).

Kwesi Aryee
fuente
40
¿No es eso exactamente lo que se ha publicado anteriormente?
XXL
-2

Intenté esto y funciona:

stage.getIcons().add(new Image(getClass().getResourceAsStream("../images/icon.png")));
Frank Mmbaga
fuente
en realidad ... no: los puntos no son compatibles con la búsqueda de recursos, lea el api doc
kleopatra