【问题标题】:JavaFX: Global Menu of Javafx applications unresponsive on MACOS 10.15 Catalina before switching applicationsJavaFX:Javafx 应用程序的全局菜单在切换应用程序之前在 MACOS 10.15 Catalina 上无响应
【发布时间】:2020-02-25 17:11:44
【问题描述】:

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

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

}

【问题讨论】:

    标签: java macos javafx macos-catalina


    【解决方案1】:

    我能够重现该问题。但是,我自己的现实世界应用程序不会遇到这个问题。

    我能够通过将 main 与应用程序类分开来摆脱它。并且主类还必须访问 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"));
        }
    
    }
    

    【讨论】:

    • 好的,刚刚确认了您的解决方案。在 Catalina 上,系统菜单似乎只能从一开始就起作用,如果您调用 Desktop.getDesktop() prior 通过调用 Application.launch(...) 来启动您的应用程序。我做了一些实验,甚至在应用程序启动时由 JavaFX 调用的 init() 方法中调用 Desktop.getDesktop() 也无法解决它。非常感谢您解决这个问题。这已经让我头疼了好几天。
    • 警告:只要应用程序没有自己定义菜单,它就可以工作。但如果有,它不会显示在全局菜单中。我会深入研究这个......
    • 为此打开了一个错误。稍后将在此处提供对问题跟踪器的引用。
    • 这并不像看起来那么糟糕:虽然从 IDE 或 mvn jafafx:ru​​n 启动我的应用程序时该错误是 100% 可重现的,但当我创建和安装一个自包含的应用程序时它可以工作。
    猜你喜欢
    • 2020-03-09
    • 1970-01-01
    • 2014-11-19
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    相关资源
    最近更新 更多