Значок додатка JavaFX


172

Чи можливо змінити піктограму програми за допомогою JavaFX або це потрібно зробити за допомогою Swing?

Відповіді:


234

Припустимо, що ваш етап "етап", а файл знаходиться у файловій системі:

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

Відповідно до коментаря нижче, якщо він загорнутий у банку, що містить, замість цього потрібно використовувати наступний підхід:

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

5
Крім того, якщо піктограма має бути встановлена ​​як ярлик програми, а ви використовуєте WebStart як технологію розгортання, можливо, ви захочете встановити відповідні налаштування значка / ярлика / робочого столу у файлі jnlp: docs.oracle.com/javase/7 / docs /
technotes

9
Ви можете додати кілька зображень різного розміру, і JavaFX вибере зображення, яке найкраще підходить. Тому що у вас є різні розміри в панелі завдань та різні в заголовку.
drzymala

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

3
Не забувайте, що принаймні на Ubuntu (Unity) значок використовується лише для прикраси вікна, але не для запуску. Щоб піктограма була видимою (замість негарного знака питання), вам потрібно вказати відповідний .dektopфайл. Дивіться мій опис тут
дзим

1
це змінює лише піктограму на заголовку, тобто верхню ліву частину вікна. як змінити значок програми, коли він знаходиться на робочому столі як ярлик? а на панелі завдань?
TejpalBh

74

Я спробував це, і це повністю працює. Код:

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

icon.png знаходиться в тій же папці, що і вихідні файли.


3
'<ім'я вашого класу> .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 знаходиться в ресурсах dir і не забудьте поставити "/" раніше, інакше це не працюватиме


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

Папка зображень повинна бути у папці "Ресурси".


4
Ця відповідь зовсім непотрібна, оскільки інша відповідь уже пояснила ту саму.
Л. Гутхардт

1

За допомогою цього кодового рядка ви можете легко помістити піктограму у свою програму

stage.getIcons (). add (нове зображення ("шлях зображення"));



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 (). Delete (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 у папку "бін" на робочій області.


-2

Ще один простий спосіб вставити власну піктограму в рядок заголовка в JavaFX - це додати зображення до основного етапу за допомогою наступного методу:

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

Переконайтесь, що імпортувати javafx.scene.image.Image (якщо ви використовуєте такий ідею, як 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.