JavaFX: название программы в панели инструментов ОС (например, Ubuntu 19.10) - PullRequest
1 голос
/ 26 января 2020

Сегодня я столкнулся со следующей проблемой:

Я установил заголовок для primaryStage, используя метод setTitle(). Этот заголовок корректно отображается в окне, но когда я наведите курсор на значок программы на панели инструментов ОС, я вижу только путь к основному классу программы (см. Скриншот ниже). Как я могу это исправить?

Заголовок в окне программы и Заголовок в Dockbar ОС . И я использую этот код:

    @Override
    public void start(Stage stage) throws IOException {
        this.stage = stage;
        instance = this;
        // App initialization
        Parent root = FXMLLoader.load(SlimeBot.class.getClassLoader().getResource("fxml/Main.fxml"));
        Scene scene = new Scene(root, 800, 600);
        stage.setTitle("SlimeBot - Панель управления");
        stage.setScene(scene);
        stage.show();
    }

Попытка установить заголовок, используя поле в java.awt.Toolkit:


    @Getter
    private static SlimeBot instance;

    static {
        try {
            Toolkit xToolkit = Toolkit.getDefaultToolkit();
            java.lang.reflect.Field awtAppClassNameField = xToolkit.getClass().getDeclaredField("awtAppClassName");
            awtAppClassNameField.setAccessible(true);
            awtAppClassNameField.set(xToolkit, "SlimeBot - Панель управления");
        } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        launch(args);
    }

    @Getter
    private Stage stage;

    @Override
    public void start(Stage stage) throws IOException {
        this.stage = stage;
        instance = this;
        // App initialization
        Parent root = FXMLLoader.load(SlimeBot.class.getClassLoader().getResource("fxml/Main.fxml"));
        Scene scene = new Scene(root, 800, 600);
        stage.setTitle("SlimeBot - Панель управления");
        stage.setScene(scene);
        stage.show();
    }

}```

1 Ответ

0 голосов
/ 27 января 2020

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

@Override
public void start(Stage stage) throws IOException {
    this.stage = stage;
    instance = this;
    // App initialization
    Parent root = FXMLLoader.load(SlimeBot.class.getClassLoader().getResource("fxml/Main.fxml"));
    Scene scene = new Scene(root, 800, 600);
    stage.setTitle("SlimeBot - Панель управления");

    try {
        Toolkit xToolkit = Toolkit.getDefaultToolkit();
        Arrays.asList(xToolkit.getClass().getDeclaredFields()).forEach(s -> System.out.println(s));
        java.lang.reflect.Field awtAppClassNameField = xToolkit.getClass().getDeclaredField("awtAppClassName");
        awtAppClassNameField.setAccessible(true);
        awtAppClassNameField.set(xToolkit, "SlimeBot - Панель управления");
    } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
        e.printStackTrace();
    }

    stage.setScene(scene);
    stage.show();
}

Когда я запускаю свое приложение JavaFX, я получаю небольшое предупреждение от X11:

(java:5232): Gdk-WARNING **: 15:35:37.334: XSetErrorHandler() called with a GDK error trap pushed. Don't do that.

...