JavaFX Application Icon

JavaJavafxJavafx 2Javafx 8Stage

Java Problem Overview


Is it possible to change the application icon using JavaFX, or does it have to be done using Swing?

Java Solutions


Solution 1 - Java

Assuming your stage is "stage" and the file is on the filesystem:

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

As per the comment below, if it's wrapped in a containing jar you'll need to use the following approach instead:

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

Solution 2 - Java

I tried this and it totally works. The code is:

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

icon.png is under the same folder as the source files.

Solution 3 - Java

Full program for starters :) This program sets icon for 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);
	}
}

Output Screnshot

JavaFX Screenshot

> Updated for JavaFX 8

No need to change the code. It still works fine. Tested and verified in Java 1.8(1.8.0_45). Path can be set to local or remote both are supported.

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

OR

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

enter image description here

Hope it helps. Thanks!!

Solution 4 - Java

If you have have a images folder and the icon is saved in that use this

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

and if you are directly using it from your package which is not a good practice use this

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

and if you have a folder structure and you have your icon inside that use

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

Solution 5 - Java

you can add it in fxml. Stage level

<icons>
    <Image url="@../../../my_icon.png"/>
</icons>

Solution 6 - Java

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

If your icon.png is in resources dir and remember to put a '/' before otherwise it will not work

Solution 7 - Java

What do you think about creating new package i.e image.icons in your src directory and moving there you .png images? Than you just need to write:

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

This solution works for me perfectly, but still I'm not sure if it's correct (beginner here).

Solution 8 - Java

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

images folder need to be in Resource folder.

Solution 9 - Java

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

You can add more than one icon with different sizes using this method.The images should be different sizes of the same image and the best size will be chosen. eg. 16x16, 32,32

Solution 10 - Java

You can easily put icon to your application using this code line

stage.getIcons().add(new Image("image path") );

Solution 11 - Java

stage.getIcons().add(new Image("/images/logo_only.png"));

It is good habit to make images folder in your src folder and get images from it.

Solution 12 - Java

I used this in my application

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

Here window is the stage.

Solution 13 - Java

If you run the jar file, the code specified by Michael Berry will change the icon in the title bar and in the taskbar. Shortcut icon cannot be changed.

If you run a native program compiled with com.zenjava, You must add a link to the program icon:

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

This will add an icon to the shortcut and taskbar.

Solution 14 - Java

Toggle icons in runtime:

In addition to the responses here, I found that once you have assigned an Icon to your application by the first time you cannot toggle it by just adding a new icon to your stage (this would be helpful if you need to toggle the icon of your app from on/off enabled/disabled).

To set a new icon during run time use the getIcons().remove(0) before trying to add a new icon, where 0 is the index of the icon you want to override like is shown here:

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

To access the stage from other methods or classes you can create a new static field for stage in you main class so can access it from out of the start() method by encapsulating in on a static method that you can access from anywhere in your app.

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

Solution 15 - Java

If you got Invalid URL or resource not found put your icon.png in the "bin" folder in your workspace.

Solution 16 - Java

Another easy way to insert your own icon on the title bar in JavaFX is to add the image to your primary stage using the following method:

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

Make sure your import javafx.scene.image.Image (if using an ide like netbeans this should be automatically done for you).

Solution 17 - Java

I tried this and it works:

stage.getIcons().add(new Image(getClass().getResourceAsStream("../images/icon.png")));

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSebb77View Question on Stackoverflow
Solution 1 - JavaMichael BerryView Answer on Stackoverflow
Solution 2 - Javauser1736233View Answer on Stackoverflow
Solution 3 - JavaMadan SapkotaView Answer on Stackoverflow
Solution 4 - JavaRahul SinghView Answer on Stackoverflow
Solution 5 - JavaDmitrij KrupaView Answer on Stackoverflow
Solution 6 - JavaLazerBananaView Answer on Stackoverflow
Solution 7 - JavaDawidView Answer on Stackoverflow
Solution 8 - JavaPsyhoZOOMView Answer on Stackoverflow
Solution 9 - JavaCTNView Answer on Stackoverflow
Solution 10 - JavaKavinda PushpithaView Answer on Stackoverflow
Solution 11 - JavaHarshad VaghelaView Answer on Stackoverflow
Solution 12 - JavaMoishinView Answer on Stackoverflow
Solution 13 - JavaOleksandr PotomkinView Answer on Stackoverflow
Solution 14 - JavaIsraelmView Answer on Stackoverflow
Solution 15 - JavaTim113View Answer on Stackoverflow
Solution 16 - JavaKwesi AryeeView Answer on Stackoverflow
Solution 17 - JavaFrank MmbagaView Answer on Stackoverflow