JavaFX:Javafx 应用程序的全局菜单在切换应用程序之前在 MACOS 10.15 Catalina 上无响应

JavaFX: Global Menu of Javafx applications unresponsive on MACOS 10.15 Catalina before switching applications

当我启动应用程序时,全局菜单显示但无法通过鼠标或键盘访问。该应用程序本身可以运行并且响应迅速。当我切换到另一个应用程序然后再返回时,一切都按预期进行。

如果应用程序自己提供任何菜单似乎无关紧要,因为标准 "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();
    }

}

我能够重现问题。然而,我自己的实际应用程序并没有遇到这个问题。

我能够通过将主应用程序与应用程序分开来摆脱它 class。并且主要 class 还必须访问 Desktop.getDesktop。 通过这种分离,-Xdock:name="HelloFX" 参数也起作用,之前没有效果。

我不知道为什么需要这些步骤。较早的 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"));
    }

}