Отображение двух окон одновременно в полноэкранном режиме с помощью JavaFx Scene Builder 2.0

Я работаю над мини-приложением, в котором мне нужно отображать для пользователей 2 окна одновременно, но в полноэкранном режиме (приложение будет сделано для пользователей на двойном экране).

Я работаю с JavaFx Scene Builder 2.0 в NetBeans 8.0.1.

Я пробовал это, но в полноэкранном режиме отображается только второе окно.

public void showTwoScreens() {
    try {
        Parent root = FXMLLoader.load(getClass().getResource("ClientsOperationsWindow.fxml"));
        Scene scene = new Scene(root);

        globalStage.setScene(scene);
        globalStage.setFullScreen(true);
        globalStage.setResizable(true);
        globalStage.show();

        Stage anotherStage = new Stage();
        Parent secondRoot = FXMLLoader.load(getClass().getResource("ClientsSearchWindow.fxml"));

        Scene secondStage = new Scene(secondRoot);
        secondStage.setScene(anotherScene);
        secondStage.setFullScreen(true);
        secondStage.show();

    } catch (Exception ex) {
        System.out.println(ex.getMessage());
    }
}

можно ли отображать два окна на весь экран?

Спасибо!


person i.lagouilly    schedule 17.10.2014    source источник
comment
Я не думаю, что это возможно. Я проверил некоторые идеи на своем Mac. В Java 1.8.0_20 и более ранних версиях реализация JDK для Mac использует собственную полноэкранную реализацию, но применяет эксклюзивный режим, поэтому при использовании полноэкранного режима может быть активным только одно окно. Java 1.8.0_40 (используя версию с ранним доступом) использует собственный полноэкранный режим ОС. В этой версии, если я вызываю setFullScreen(true) на двух этапах, я вижу, что первый выходит из полноэкранного режима, когда второй входит в него, поэтому я предполагаю, что ОС здесь обеспечивает эксклюзивность. Я не знаю, что происходит в Windows, но я думаю, что будет то же самое.   -  person James_D    schedule 17.10.2014


Ответы (1)


Я думаю, что вы не можете установить две сцены в полноэкранном режиме на двух мониторах одновременно, но вы можете получить тот же результат, форсировав размеры сцены.

Для этого мы будем использовать javafx.stage.Screen, чтобы получить характеристики для каждого из различных подключенных мониторов. Затем мы загружаем файлы fxml в каждую сцену и отображаем каждую сцену на своей сцене. С помощью Screen.getBounds() мы теперь получаем начало координат и размеры прямоугольника, относящиеся к основному экрану. Таким образом, мы устанавливаем границы каждого этапа с границами этих прямоугольников. Наконец, мы устанавливаем стиль без оформления. Единственная отсутствующая сейчас функция — это комбинация клавиш для выхода из «полноэкранного» режима.

private Screen secondaryScreen;

@Override
public void start(Stage primaryStage) throws IOException {

    Screen primaryScreen = Screen.getPrimary();

    Parent root = FXMLLoader.load(getClass().getResource("Screen1.fxml"));
    Scene scene = new Scene(root);
    primaryStage.setScene(scene);
    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.show();

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

    if(secondaryScreen!=null){
        Stage secondaryStage = new Stage();
        Parent root2 = FXMLLoader.load(getClass().getResource("Screen2.fxml"));
        Scene scene2 = new Scene(root2);
        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();  
    } 
}
person José Pereda    schedule 17.10.2014
comment
Спасибо ! Я попробовал то, что вы предложили, и это работает :) и вторичныйStage.initStyle(StageStyle.UNDECORATED); эти строки вызвали исключение во время выполнения приложения, поэтому мне пришлось убрать их из моего кода;) - person i.lagouilly; 20.10.2014