JavaFX: глобальное меню приложений Javafx, не отвечающих на MACOS 10.15 Catalina до переключения приложений - PullRequest
1 голос
/ 30 октября 2019

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

Кажется, не имеет значения, если приложение предоставляет какое-либо меню самостоятельно, так как такая же проблема возникает со стандартным меню приложения 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();
    }

}

1 Ответ

1 голос
/ 31 октября 2019

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

Мне удалось избавиться от него, отделив main от класса приложения. И главный класс также должен иметь доступ к 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"));
    }

}
...