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"));
}
}
当我启动应用程序时,全局菜单显示但无法通过鼠标或键盘访问。该应用程序本身可以运行并且响应迅速。当我切换到另一个应用程序然后再返回时,一切都按预期进行。
如果应用程序自己提供任何菜单似乎无关紧要,因为标准 "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"));
}
}