JavaFX: у TilePane используйте полную ширину окна при переключении сцен

Я хотел бы иметь TilePaneохватывающую всю ширину окна. При настройке myStage,Scene, and TilePanewindow без каких-либо конкретных настроек это работает должным образом. Это даже в том случае, когда я устанавливаюtilePane.setPrefColumns(100), хотя мой экран достаточно широк только для 9 плиток. Я не устанавливал размер сцены вручную.

Когда мое приложение запускается, сцена сначала устанавливается в ширину 1, затем 320, затем 1920 (при запуске на экране 1920×1080). Я запускаю XMonad (оконный менеджер листов), который может привести к ширине 320 между, прежде чем показывать окно в полноэкранном режиме.

Однако после переключения на другую сцену ( stage.setScene) и переключения обратно — повторного использования старой сцены или построения новой сцены с использованием того же кода, который использовался изначально-предпочтительная ширина TilePane(намного больше 1920) используется для установки ширины сцены и сцены. Таким образом, 100столбцы, упомянутые выше, «показаны», хотя экран достаточно широк только для 9 столбцов.

При ручном изменении размера окна все «привязывается» к ожидаемым значениям (т. е. 1920 в моем случае).

Как я могу убедиться, что сцена, которая (повторно)присоединена к сцене, отображается с шириной экрана? Как я могу вызвать поддельное событие «изменение размера окна»? Как сделать так, чтобы ширина сцены/панели зависела от ширины сцены, а не наоборот?

Я бы предпочел решения, которые также работают в многоэкранных настройках.

2 ответа

  1. Предполагая, что все сцены находятся на одной сцене, что вы можете сделать, это

    GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
    
    stage.sceneProperty().addListener(e -> {        
        if(stage.getScene() == EnterSceneYouWantHere)
        {
            tilePane.setMaxWidth(gd.getDisplayMode().getWidth());                                                                                                                                 
            tilePane.setMaxHeight(gd.getDisplayMode().getHeight());
            tilePane.setMinWidth(gd.getDisplayMode().getWidth());                                                                                                                                 
            tilePane.setMinHeight(gd.getDisplayMode().getHeight());
        }
    });
    

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

  2. Что на самом деле помогло в моем случае, было назначить начальные widthи heightзначения для этапа:

    stage.setWidth(800);
    stage.setHeight(600);