JavaFX:滚动窗格不适合父级

时间:2017-08-31 18:36:56

标签: java javafx layout

我想创建以下场景:

+-----------------------------------------------+
|ROOT (=BorderPane)                             |
|                                               |
| +-------------------------------------------+ |
| |TOOL BAR                                   | |
| |(north)                                    | |
| +-------------------------------------------+ |
|                                               |
| +-------------------------------------------+ |
| |MyConfigurationComponent extends BorderPane| |
| |(center)                                   | |
| |  +-------------------------+  +---------+ | |
| |  |ScrollPane               |  |         | | |
| |  |(center)                 |  |         | | |
| |  | +---------------------+ |  |         | | |
| |  | |                     | |  |         | | |
| |  | |                     | |  |  SIDE   | | |
| |  | |       CANVAS        | |  |  PANE   | | |
| |  | |                     | |  | (right) | | |
| |  | |                     | |  |         | | |
| |  | |                     | |  |         | | |
| |  | +---------------------+ |  |         | | |
| |  |                         |  |         | | |
| |  +-------------------------+  +---------+ | |
| |                                           | |
| +-------------------------------------------+ |
|                                               |
+-----------------------------------------------+

期望

我想让ScrollPane尽可能大。这意味着ScrollPane应该增长并填充整个区域,无论场景大小如何。

由于TOOL BARSIDE PANE都有固定(首选)宽度和高度,我认为ScrollPane会拉伸并填充整个剩余区域。

实际行为

但事实并非如此。 ScrollPane以某种方式神奇地将其最小尺寸设置为大约40x40。拉伸高度以匹配SIDE PANEL的高度,但宽度仍然相同,似乎没有任何东西可以改变它。

事实上,使ScrollPane更大的唯一一件事就是明确地将minWidth设置为某​​个值(即400)。但这并没有解决ScrollPane的自动抵抗问题。

当我将背景颜色设置为MyConfigurationComponent时,我可以看到背景颜色按预期填充整个区域(因此问题不在于MyConfigurationComponent)。看起来它的中心子项(ScrollPane)被渲染为左,右子项(SIDE PANEL)作为中心,因为右侧的所有剩余区域都是空白的(但是具有背景,所以它仍然是MyConfigurationComponent!)。

我尝试了什么

  • minprefmax的{​​{1}}尺寸设为特定值
  • 将首选大小绑定到父级的大小
  • ScrollPanefitToWidth设置为true
  • fitToHeightScrollPane一起包裹,并将锚定到所有四个方面
  • 使用VBox包装AnchorPane并将优先级设置为allways

当前解决方法

ScrollPane的宽度减去MyConfigurationComponent的宽度绑定到SIDE PANEL。在很多方面都错了。

代码

ROOT.fxml

ScrollPane

MyConfigurationComponent.fxml

<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1" fx:controller="cz.upol.fapapp.cfa.gui.frame.FxCFAConfigFrameController">
   <top>
            <ToolBar>
                <Button text="Some button" />
            </ToolBar>
   </top>
   <center>
      <MyConfigurationComponent fx:id="configComp" />
   </center> 
</BorderPane>

问题

  • <BorderPane xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1"> <center> <ScrollPane fx:id="scrollPane"> <content> <Canvas width="2000" height="2000" /> </content> </ScrollPane> </center> <right> <VBox prefWidth="100.0" BorderPane.alignment="CENTER_RIGHT"> <children> <Label text="Colors" /> <ComboBox fx:id="cmbColors" prefWidth="100.0" /> <!-- ... --> <Separator prefHeight="15.0" prefWidth="100.0" /> <Button mnemonicParsing="false" text="Action 1" /> <Button mnemonicParsing="false" text="Action 2" /> </children> </VBox> </right> </BorderPane> 的中心扩展其大小以填充内容,不是吗?
  • 这可能是由BorderPane内的BorderPane以某种方式造成的吗?
  • 是否有比“我的解决方法”更好的解决方案?

2 个答案:

答案 0 :(得分:0)

您可以将其放在代码中的start方法中:

stage.widthProperty().addListener(event -> {
    scrollPane.setPrefWidth(stage.getWidth());
});

stage.heightProperty().addListener(event -> {
    scrollPane.setPrefHeight(stage.getHeight());
});

如果这不起作用,我建议也将BorderPane的宽度和高度设置为舞台的尺寸:

stage.widthProperty().addListener(event -> {
    scrollPane.setPrefWidth(stage.getWidth());
    borderPane.setPrefWidth(stage.getWidth());
});

stage.heightProperty().addListener(event -> {
    scrollPane.setPrefHeight(stage.getHeight());
    borderPane.setPrefHeight(stage.getHeight());
});

答案 1 :(得分:0)