Set Icon on Stage in JavaFX
Categories:
Setting a Custom Icon for Your JavaFX Stage

Learn how to personalize your JavaFX applications by setting a custom icon for the main window (Stage), enhancing user experience and branding.
Customizing the appearance of your JavaFX application is crucial for branding and user recognition. One of the simplest yet most effective ways to do this is by setting a custom icon for your application's main window, known as the Stage
. This icon appears in the window's title bar, the taskbar (on most operating systems), and potentially in other system UI elements like the Alt+Tab switcher.
Understanding JavaFX Stage Icons
In JavaFX, the Stage
class represents the top-level container for your application's UI. Each Stage
can have one or more icons associated with it. These icons are typically Image
objects loaded from a file. JavaFX supports common image formats like PNG, JPEG, and GIF. It's good practice to provide multiple icon sizes to ensure your application looks sharp across different display resolutions and operating system scaling settings.
flowchart TD A[Start JavaFX Application] --> B{Create Primary Stage} B --> C[Load Icon Image(s)] C --> D["Add Image(s) to Stage.getIcons()"] D --> E[Show Stage] E --> F[Application Running with Custom Icon]
Flowchart of setting a JavaFX Stage icon
Implementing a Custom Stage Icon
The process involves loading an Image
object and then adding it to the ObservableList<Image>
returned by Stage.getIcons()
. You can add multiple images of different sizes; the operating system will then choose the most appropriate size for the context. If only one size is provided, the OS will scale it, which might lead to blurriness if the original image is not suitable for the target size.
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class IconExample extends Application {
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("My Custom Icon App");
// 1. Load the icon image
// Ensure 'icon.png' is in your project's resources folder (e.g., src/main/resources)
// Or provide an absolute path, but relative paths are generally better for deployment.
try {
Image icon = new Image(getClass().getResourceAsStream("/icon.png"));
primaryStage.getIcons().add(icon);
} catch (NullPointerException e) {
System.err.println("Icon file not found! Make sure 'icon.png' is in your resources.");
// Fallback or use a default icon if desired
}
StackPane root = new StackPane();
Scene scene = new Scene(root, 300, 200);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
JavaFX application demonstrating how to set a custom stage icon.
Stage.getIcons()
. The operating system will automatically select the most appropriate size, preventing scaling artifacts.Handling Icon Resources and Paths
The most robust way to load resources like images in JavaFX is by using getClass().getResourceAsStream()
. This method allows you to load resources that are bundled within your JAR file, making your application portable. The path provided to getResourceAsStream()
should be relative to the root of your classpath. For example, if your icon.png
is in src/main/resources/
, you would reference it as /icon.png
.
// Example with multiple icon sizes
primaryStage.getIcons().addAll(
new Image(getClass().getResourceAsStream("/icons/icon_16x16.png")),
new Image(getClass().getResourceAsStream("/icons/icon_32x32.png")),
new Image(getClass().getResourceAsStream("/icons/icon_64x64.png"))
);
// Example with an external file (less recommended for deployment)
// Image externalIcon = new Image("file:/path/to/your/icon.png");
// primaryStage.getIcons().add(externalIcon);
Loading multiple icon sizes and an alternative for external files.
NullPointerException
when loading resources, as getResourceAsStream()
returns null
if the resource is not found. This can prevent your application from crashing if the icon file is missing.1. Prepare Your Icon Files
Create or obtain your application icon in various sizes (e.g., 16x16, 32x32, 64x64 pixels) and save them as PNG files for transparency support. Name them descriptively, like icon_16x16.png
.
2. Place Icons in Resources
In your project structure, create a resources
folder (e.g., src/main/resources/icons/
) and place your icon files there. This ensures they are bundled with your application.
3. Load and Set Icons in JavaFX
In your start()
method, use new Image(getClass().getResourceAsStream("/path/to/your/icon.png"))
to load each icon, then add them to primaryStage.getIcons().addAll(...)
.
4. Run and Verify
Compile and run your JavaFX application. Observe the window title bar and taskbar to confirm your custom icon is displayed correctly.