JavaFX: глобальное меню приложений Javafx, не отвечающих на MACOS 10.15 Catalina перед переключением приложений

Когда я запускаю приложение, отображается глобальное меню, но к нему нельзя получить доступ ни с помощью мыши, ни с клавиатуры. Само приложение работает и отзывчиво. Когда я переключаюсь на другое приложение, а затем обратно, все работает, как ожидалось.

Кажется неуместным, если приложение предоставляет какое-либо меню само по себе, поскольку та же проблема возникает со стандартным меню приложения «Java», например, в FXHello (код ниже).

Эта проблема не возникает в MACOS 10.14 Mojave.

Кто-нибудь еще испытал это? Если да, то есть ли обходной путь?

Пример кода взят из примеров JavaFX:

package hellofx;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class HelloFX extends Application {

    @Override
    public void start(Stage stage) {
        String javaVersion = System.getProperty("java.version");
        String javafxVersion = System.getProperty("javafx.version");
        Label l = new Label("Hello, JavaFX " + javafxVersion + ", running on Java " + javaVersion + ".");
        Scene scene = new Scene(new StackPane(l), 640, 480);
        stage.setScene(scene);
        stage.show();
        stage.requestFocus();
    }

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

}

person Axel    schedule 30.10.2019    source источник


Ответы (1)


Я могу воспроизвести проблему. Однако мое собственное приложение в реальном мире не страдает от этой проблемы.

Я смог избавиться от него, отделив основной класс от класса приложения. И основной класс также должен иметь доступ к Desktop.getDesktop. С этим разделением также работает параметр -Xdock: name = "HelloFX", который ранее не действовал.

Понятия не имею, зачем нужны эти шаги. Ранние вызовы Desktop также необходимы с более ранними версиями Mac OS для обеспечения надлежащей системной интеграции.

package hellofx;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class Appl extends Application {

    @Override
    public void start(Stage stage) {
        String javaVersion = System.getProperty("java.version");
        String javafxVersion = System.getProperty("javafx.version");
        Label l = new Label("Hello, JavaFX " + javafxVersion + ", running on Java " + javaVersion + ".");
        Scene scene = new Scene(new StackPane(l), 640, 480);
        stage.setScene(scene);
        stage.show();
        stage.requestFocus();
    }
}
package hellofx;

import java.awt.Desktop;

import javafx.application.Application;

public class HelloFX {

    public static void main(String[] args) {
        registerForMacOSXEvents();
        Application.launch(Appl.class, args);
    }

    protected static void registerForMacOSXEvents() {
        Desktop desktop = Desktop.getDesktop();
        desktop.setAboutHandler(e -> System.out.println("About"));
    }

}
person Thomas Andres    schedule 30.10.2019
comment
ОК, только что подтвердили свое решение. Похоже, что в Catalina системное меню работает только с самого начала, если вы вызываете Desktop.getDesktop() before для запуска приложения, вызывая Application.launch(...). Я немного поэкспериментировал, и даже вызов Desktop.getDesktop() в init() методе, который вызывается JavaFX при запуске приложения, не решает эту проблему. Большое вам спасибо за то, что разобрались с этим. Это уже несколько дней вызывает у меня головные боли. - person Axel; 01.11.2019
comment
Предостережение: он работает до тех пор, пока приложение не определяет меню самостоятельно. Но если есть, то в глобальном меню он не отображается. Я покопаюсь в этом ... - person Axel; 01.11.2019
comment
Открыл баг для этого. Позже здесь будет ссылка на систему отслеживания проблем. - person Axel; 02.11.2019
comment
Отчет об ошибке - person Axel; 06.11.2019
comment
Это не так плохо, как кажется: хотя ошибка на 100% воспроизводима при запуске моего приложения из среды IDE или mvn jafafx: run, она работает, когда я создаю и устанавливаю автономное приложение. - person Axel; 12.02.2020