JavaFX. Установите различные значки для строки заголовка и панели задач операционной системы.

Есть ли способ в JavaFX установить различные значки приложений для строки заголовка и панели задач операционной системы?

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

Я хотел бы использовать разные изображения для разных размеров значков. Подобно тому, что вы делаете в файле .ico.

Если я назову stage.getIcons().add(...) два раза, первое изображение будет всегда использоваться для обеих полос.

Я также не смог использовать уже существующий файл .ico(который поддерживает разные размеры) для этих целей.

Ответы

Ответ 1

Существует способ, используя два разных этапа, но может иметь проблемы (тестируется только в Windows 7). В следующем примере используется Java 8/JavaFX 8.

Этот код устанавливает значок, который отображается на панели задач на основном этапе, полученном при запуске JavaFX, но делает сцену невидимой (прозрачный, нулевой размер). Затем он открывает новое и видимое окно с другим значком.

Поскольку это только дочернее окно, а не реальное, событие hide должно быть делегировано на скрытый этап, чтобы закрыть приложение. Может быть больше событий, которые должны быть делегированы, как минимизация окна.

public class Main extends Application {
    public static void main(String[] args) {
        Application.launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        primaryStage.getIcons().add(getImage("taskbar_icon.png"));
        primaryStage.initStyle(StageStyle.TRANSPARENT);
        primaryStage.setWidth(0);
        primaryStage.setHeight(0);
        primaryStage.show();

        Stage visibleStage = new Stage();
        visibleStage.initOwner(primaryStage);
        visibleStage.getIcons().add(getImage("window_icon.png"));
        visibleStage.setScene(new Scene(...));
        visibleStage.setOnHidden(e -> Platform.runLater(primaryStage::hide));
        visibleStage.show();
    }
}