将布局绑定到屏幕分辨率

时间:2021-01-10 18:43:59

标签: java javafx

我的布局是这样的:

enter image description here

面板是 VBox,内容是 HBox。两者都包含在 HBox 中。 我需要使面板固定大小,所以现在我这样做:

VBox panel = new VBox();
double fixedWidth = Screen.getPrimary().getBounds().getWidth() / 10;
panel.setMinWidth(fixedWidth);
panel.setMaxHeight(fixedWidth);

...但是如果用户的屏幕分辨率发生变化怎么办?该代码无法处理,恐怕 Screen 类不提供任何类型的回调。

2 个答案:

答案 0 :(得分:2)

您的标题和大部分问题表明您希望 panel 使用屏幕宽度的 10%,而 content 使用屏幕宽度的 90%。但是,您也使用了不同的术语“固定宽度”;即,无论屏幕大小如何,panel 始终具有相同的宽度。

我假设您指的是第一个概念:您希望 panel 使用宽度的 10%,而 content 使用宽度的 90%。

使用 GridPane 代替 HBox。将其 column constraints 设置为 10% 和 90%。

ColumnConstraints panelWidth = new ColumnConstraints();
panelWidth.setPercentWidth(10);
panelWidth.setFillWidth(true);

ColumnConstraints contentWidth = new ColumnConstraints();
contentWidth.setPercentWidth(90);
contentWidth.setFillWidth(true);

RowConstraints rowConstraints = new RowConstraints();
rowConstraints.setFillHeight(true);
rowConstraints.setVgrow(Priority.ALWAYS);

GridPane pane = new GridPane();
pane.addRow(0, panel, content);
pane.getColumnConstraints().setAll(panelWidth, contentWidth);
pane.getRowConstraints().setAll(rowConstraints);

答案 1 :(得分:0)

根据您当前的解决方案,您似乎为面板提供了 10% 的大小,这意味着 90% 是内容面板。您可以直接将屏幕尺寸绑定到您的场景对象并使用屏幕尺寸初始化您的场景。它将使整个应用程序对屏幕分辨率的变化做出反应。这是我的代码示例,介绍了我的操作方式:

final Scene scene = new Scene(root,width,height);
            
            logger.debug("Scene Created");
            stage.centerOnScreen();
            stage.setScene(scene);
           
            final ChangeListener<Number> listener = new ChangeListener<Number>()
            {
                    @Override
                    public void changed(ObservableValue<? extends Number> observable, Number oldValue, final Number newValue)
                    {
                        logger.debug("Scene Resize Started");
                        Scale scale = new Scale();
                        scale.xProperty().bind(scene.widthProperty().divide(width));
                        scale.yProperty().bind(scene.heightProperty().divide(height));
                        scale.setPivotX(0); scale.setPivotY(0);
                        root.getTransforms().clear();
                        root.getTransforms().addAll(scale);
                        logger.debug("Scene Resize Ended");
                          
                    }
            };
            
            scene.widthProperty().addListener(listener);
            scene.heightProperty().addListener(listener);

这负责调整大小和分辨率更改。开头的宽度和高度变量是从用户的屏幕中捕获的宽度和高度。

相关问题