Вот код, который я использую (в основном скопирован из здесь). Это простое приложение, которое открывает два этапа, по одному на каждом из двух мониторов, подключенных к 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-адреса являются заполнителями, поскольку страницы развертывания отображаются только без взаимодействия.
public void start(Stage primaryStage)
, строки прямо перед моим кодом. Я не думал, что это нужно инициализировать. Однако я добавилprimaryStage = new Stage();
в самом начале и все еще вижу ту же проблему. - person Yash Capoor   schedule 08.12.2015primaryStage.fullscreen.value
наtrue
. Это и ожидаемое, и желаемое поведение. Пошагово выполняя код, эта строка на самом деле не вызывает исключение. Вторая строка от него делает (primaryStage.show();
). Однако закомментирование строкиsetFullScreen(true)
по-прежнему заставляетshow()
работать правильно. - person Yash Capoor   schedule 08.12.2015