Иконка приложения JavaFX


172

Можно ли изменить значок приложения с помощью JavaFX или это нужно сделать с помощью Swing?

Ответы:


234

Предполагая, что ваш этап - «этап», а файл находится в файловой системе:

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

Согласно приведенному ниже комментарию, если он помещен в содержащий jar-файл, вам нужно будет использовать следующий подход:

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

5
Кроме того, если значок должен быть установлен как ярлык приложения, и вы используете WebStart в качестве технологии развертывания, вам может потребоваться установить соответствующие настройки значка / ярлыка / рабочего стола в файле jnlp
jewelsea

9
Вы можете добавить несколько изображений разных размеров, и JavaFX выберет то, которое подходит лучше всего. Потому что у вас разные размеры в панели задач и разные в строке заголовка.
drzymala

11
Я думаю, что это работает только тогда, когда файл находится в файловой системе, для более распространенной ситуации, когда значок находится внутри файла jar и в пути к классам, это не работает для меня. Одно из других решений с использованием stage.getIcons().add( new Image( <yourclassname>.class.getResourceAsStream( "icon.png" )));работ.
k_o_

3
Обратите внимание, что по крайней мере в Ubuntu (Unity) значок используется только для оформления окна, но не для запуска. Чтобы значок был виден (вместо уродливого знака вопроса), вам нужно указать соответствующий .dektopфайл. Смотрите мое описание здесь
dzim

1
это меняет только значок в строке заголовка, то есть в верхнем левом углу окна. как изменить значок приложения, когда оно на рабочем столе в качестве ярлыка? а на панели задач?
TejpalBh

74

Я попробовал это, и это полностью работает. Код является:

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

icon.png находится в той же папке, что и исходные файлы.


3
'<yourclassname> .class' можно заменить на 'getClass ()'
Джим Фред

71

Полная программа для начинающих :) Эта программа устанавливает значок для 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);
    }
}

Выходной скриншот

Скриншот JavaFX

Обновлено для JavaFX 8

Не нужно менять код. Это все еще работает отлично. Протестировано и проверено в Java 1.8 (1.8.0_45). Путь может быть установлен на локальный или удаленный оба поддерживаются.

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

ИЛИ

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

введите описание изображения здесь

Надеюсь, поможет. Спасибо!!


Это поддерживает SVG?
Qed

1
@ qed, я не думаю, что SVG поддерживается, но я не уверен на 100%. Вы можете проверить это.
Мадан Сапкота

Я только что попытался использовать файл .svg для значка приложения JavaFX. Это не работает. Ошибок не было, но JavaFX использовал логотип по умолчанию вместо моего.
Саймон Димерт


7

Если у вас есть папка с изображениями и значок сохранен в этом, используйте эту

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

и если вы напрямую используете его из своего пакета, который не является хорошей практикой, используйте это

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

и если у вас есть структура папок и у вас есть значок внутри этого использования

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

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

Если ваш icon.png находится в каталоге ресурсов, и не забудьте поставить «/», иначе он не будет работать


2

Что вы думаете о создании нового пакета, т.е. image.icons, в вашем каталоге src и перемещении туда ваших изображений .png? Чем вам просто нужно написать:

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

Это решение отлично работает для меня, но все же я не уверен, правильно ли оно (новичок здесь).


Не рекомендуется размещать ресурсы в ваших Java-пакетах. Рекомендуется поместить их в вашу resourcesпапку.
Thibstars

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

Используя этот метод, вы можете добавить более одного значка с разными размерами. Изображения должны быть разных размеров одного и того же изображения, и будет выбран лучший размер. eg. 16x16, 32,32


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

Папка images должна находиться в папке Resource.


4
Этот ответ совершенно не нужен, так как другой ответ уже объяснил то же самое.
Л.

1

Вы можете легко поместить значок в свое приложение, используя эту строку кода

stage.getIcons (). add (new Image ("путь к изображению"));


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

Хорошей привычкой является создание папки images в папке src и получение изображений из нее.


Этот ответ совершенно не нужен, так как другой ответ уже объяснил то же самое.
Л.

0

Я использовал это в моем приложении

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

Здесь окно - сцена.


0

Если вы запустите JAR-файл, код, указанный Майклом Берри, изменит значок в строке заголовка и на панели задач. Значок ярлыка не может быть изменен.

Если вы запускаете нативную программу, скомпилированную с com.zenjava, вы должны добавить ссылку на значок программы:

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

Это добавит значок на ярлык и панель задач.


0

Переключить значки во время выполнения:

В дополнение к ответам, приведенным здесь, я обнаружил, что, как только вы в первый раз назначили значок своему приложению, вы не можете переключать его, просто добавив новый значок на сцену (это будет полезно, если вам нужно переключить значок вашего приложения). приложение из вкл / выкл включено / отключено).

Чтобы установить новый значок во время выполнения, используйте getIcons (). Remove (0), прежде чем пытаться добавить новый значок, где 0 - это индекс значка, который вы хотите переопределить, как показано здесь:

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

Чтобы получить доступ к рабочей области из других методов или классов, вы можете создать новое статическое поле для рабочей области в своем основном классе, чтобы получить к нему доступ из метода start (), инкапсулировав статический метод, к которому можно получить доступ из любого места в вашем приложении. ,

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

-1

Если вы получили, Invalid URL or resource not foundпоместите ваш icon.png в папку «bin» в вашем рабочем пространстве.


-2

Еще один простой способ вставить свой собственный значок в строку заголовка в JavaFX - добавить изображение на начальный этап, используя следующий метод:

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

Убедитесь, что вы импортируете javafx.scene.image.Image (если вы используете ide как netbeans, это должно быть сделано автоматически для вас).


40
это не то , что было опубликовано выше?
XXL

-2

Я попробовал это, и это работает:

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

на самом деле, .. нет: точки не поддерживаются при поиске ресурсов, пожалуйста, прочитайте api doc
kleopatra
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.