Что вызывает это исключение NullPointerException, когда я использую stage.SetFullScreen(true) из библиотеки JavaFX на Mac?

Вот код, который я использую (в основном скопирован из здесь). Это простое приложение, которое открывает два этапа, по одному на каждом из двух мониторов, подключенных к mac mini под управлением 10.9.1, с использованием JDK 8u66.

    Screen primaryScreen = Screen.getPrimary();

    WebView  browser = new WebView();
    WebEngine engine = browser.getEngine();
    //String url = "http://menu.madebyxdlab.com/show.php?pageType=screen1";
    String url = "http://www.google.com";
    engine.load(url);
    System.out.println("First page loaded into WebEngine");

    WebView  browser2 = new WebView();
    WebEngine engine2 = browser2.getEngine();
    //String url2 = "http://menu.madebyxdlab.com/show.php?pageType=screen2";
    String url2= "http://www.yahoo.com";
    engine2.load(url2);
    System.out.println("Second page loaded into WebEngine");

    //Pane pane = new Pane(browser);

    Scene scene = new Scene(browser);


    Rectangle2D bounds = primaryScreen.getBounds();
    primaryStage.setX(bounds.getMinX());
    primaryStage.setY(bounds.getMinY());
    primaryStage.setWidth(bounds.getWidth());
    primaryStage.setHeight(bounds.getHeight());
    primaryStage.initStyle(StageStyle.UNDECORATED);
    primaryStage.setFullScreen(true);
    primaryStage.setScene(scene);
    primaryStage.show();
    System.out.println("First Screen Set");


    //       look for a second screen
    Screen.getScreens().stream()
    .filter(s->!s.equals(primaryScreen))
    .findFirst().ifPresent(s->secondaryScreen = s);

    if(secondaryScreen!=null){
        System.out.println("Second Screen detected");
        Stage secondaryStage = new Stage();
        Scene scene2 = new Scene(browser2);
        secondaryStage.setScene(scene2);
        Rectangle2D bounds2 = secondaryScreen.getBounds();
        secondaryStage.setX(bounds2.getMinX());
        secondaryStage.setY(bounds2.getMinY());
        secondaryStage.setWidth(bounds2.getWidth());
        secondaryStage.setHeight(bounds2.getHeight());
        secondaryStage.initStyle(StageStyle.UNDECORATED);
        secondaryStage.show();  
        System.out.println("Second Screen Set");
    }

Если primaryStage.setFullScreen(true); закомментирован, то работает нормально, но если он активен, система выдает следующее NPE:

Exception in thread "JavaFX Application Thread" java.lang.NullPointerException
at com.sun.javafx.webkit.theme.ScrollBarThemeImpl.getThumb(ScrollBarThemeImpl.java:409)
at com.sun.javafx.webkit.theme.ScrollBarThemeImpl.thumbPosition(ScrollBarThemeImpl.java:293)
at com.sun.javafx.webkit.theme.ScrollBarThemeImpl.getThumbPosition(ScrollBarThemeImpl.java:389)
at com.sun.webkit.Timer.twkFireTimerEvent(Native Method)
at com.sun.webkit.Timer.fireTimerEvent(Timer.java:83)
at com.sun.webkit.Timer.notifyTick(Timer.java:64)
at javafx.scene.web.WebEngine$PulseTimer.lambda$static$45(WebEngine.java:1201)
at com.sun.javafx.tk.Toolkit.lambda$runPulse$30(Toolkit.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.Toolkit.runPulse(Toolkit.java:354)
at com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:381)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:510)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:490)
at com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$404(QuantumToolkit.java:319)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.mac.MacApplication._enterNestedEventLoopImpl(Native Method)
at com.sun.glass.ui.mac.MacApplication._enterNestedEventLoop(MacApplication.java:109)
at com.sun.glass.ui.Application.enterNestedEventLoop(Application.java:511)
at com.sun.glass.ui.mac.MacView._enterFullscreen(Native Method)
at com.sun.glass.ui.View.enterFullscreen(View.java:784)
at com.sun.javafx.tk.quantum.WindowStage.applyFullScreen(WindowStage.java:630)
at com.sun.javafx.tk.quantum.WindowStage.setFullScreen(WindowStage.java:720)
at javafx.stage.Stage.impl_visibleChanged(Stage.java:1189)
at javafx.stage.Window$9.invalidated(Window.java:895)
at javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:109)
at javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:144)
at javafx.stage.Window.setShowing(Window.java:922)
at javafx.stage.Window.show(Window.java:937)
at javafx.stage.Stage.show(Stage.java:259)
at fullScreenHandler.fullScreenCreator.start(fullScreenCreator.java:63)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)

Я понимаю, что я не могу запустить оба этапа в полноэкранном режиме, но я надеюсь запустить хотя бы первый экран в полноэкранном режиме, а затем настроить второй. URL-адреса являются заполнителями, поскольку страницы развертывания отображаются только без взаимодействия.


person Yash Capoor    schedule 08.12.2015    source источник
comment
primaryStage не инициализируется при вызове этого метода set.   -  person Stultuske    schedule 08.12.2015
comment
primaryStage происходит от public void start(Stage primaryStage), строки прямо перед моим кодом. Я не думал, что это нужно инициализировать. Однако я добавил primaryStage = new Stage(); в самом начале и все еще вижу ту же проблему.   -  person Yash Capoor    schedule 08.12.2015
comment
В этом случае проверьте, что делает этот установщик, тогда это переменная в primaryStage, которую вы пытаетесь установить, которая не инициализирована.   -  person Stultuske    schedule 08.12.2015
comment
Таким образом, сеттер изменяет primaryStage.fullscreen.value на true. Это и ожидаемое, и желаемое поведение. Пошагово выполняя код, эта строка на самом деле не вызывает исключение. Вторая строка от него делает (primaryStage.show();). Однако закомментирование строки setFullScreen(true) по-прежнему заставляет show() работать правильно.   -  person Yash Capoor    schedule 08.12.2015
comment
Хм. Во время некоторого обновления (я думаю о JavaFX 2.2) JavaFX переключился с пользовательской полноэкранной реализации на Mac на использование собственной реализации. (Предыдущие версии JavaFX поддерживали более ранние версии OS X, которые не включали полноэкранные функции на уровне пользователя.) Я знаю, что ранние версии собственной полноэкранной реализации с двумя мониторами не допускали никакого взаимодействия с дополнительным монитором в все, но это изменилось в следующем выпуске OS X. Поэтому для меня не является большим сюрпризом, что ваш код обнаруживает ошибку, поскольку полноэкранная поддержка JavaFX, вероятно, была нацелена...   -  person James_D    schedule 08.12.2015
comment
... в версии OS X, которая вообще не поддерживала бы это. Вы должны зарегистрировать это как ошибку, и я думаю, что в качестве обходного пути просто позвольте обоим этапам использовать максимально доступные границы на каждом экране вместо использования полноэкранного режима (если вы можете).   -  person James_D    schedule 08.12.2015
comment
Я соглашаюсь на этот обходной путь. Обновлено до OSX 10.11.1, в котором есть опция автоматического скрытия строки меню, которая применяется ко всей системе, наряду с уже скрытой док-станцией. И я даю каждому этапу максимальные ограничения. Так что пока хватит.   -  person Yash Capoor    schedule 09.12.2015