1

我有一个包含 Canvas 的 BorderPane,Canvas 的高度和宽度属性绑定到 BorderPane 的属性。BorderPane 又是场景的根。

这一切都很好。如果我调整窗口大小,BorderPane 的大小会更改以匹配场景的大小,并且 Canvas 会更改以匹配 BorderPane 的大小。

但是,如果我引入另一个 BorderPane,它将停止工作:内部 BorderPane 和 Canvas 将随着 Scene 和外部 BorderPane 的增长而增长,但是当我缩小窗口时,它们不会缩小。

  Working:            Not working:

 ┌──────────────┐    ┌────────────────┐
 │    Scene     │    │     Scene      │
 │┌────────────┐│    │┌──────────────┐│
 ││ BorderPane ││    ││  BorderPane  ││
 ││┌──────────┐││    ││┌────────────┐││
 │││  Canvas  │││    │││ BorderPane │││
 ││└──────────┘││    │││┌──────────┐│││
 │└────────────┘│    ││││  Canvas  ││││
 └──────────────┘    │││└──────────┘│││
                     ││└────────────┘││
                     │└──────────────┘│
                     └────────────────┘

有效的代码:

BorderPane parent = new BorderPane();
Canvas canvas = new Canvas();
canvas.widthProperty().bind(parent.widthProperty());
canvas.heightProperty().bind(parent.heightProperty());
parent.setCenter(canvas);
Scene scene = new Scene(parent);
stage.setScene(scene);
stage.show();

不起作用的代码:

BorderPane inner = new BorderPane();

Canvas canvas = new Canvas();
canvas.widthProperty().bind(inner.widthProperty());
canvas.heightProperty().bind(inner.heightProperty());
inner.setCenter(canvas);

BorderPane outer = new BorderPane();
outer.setCenter(inner);

Scene scene = new Scene(outer);
stage.setScene(scene);
stage.show();

我添加了一些日志记录以确认问题:

# scene, outer pane, inner pane, and canvas growing
outer width: 1364.0 -> 1374.0
scene width: 1364.0 -> 1374.0
outer height: 339.0 -> 342.0
scene height: 339.0 -> 342.0
canvas width: 1364.0 -> 1374.0
inner width: 1364.0 -> 1374.0
canvas height: 339.0 -> 342.0
inner height: 339.0 -> 342.0
# scene and outer pane shrinking, canvas and inner not
outer width: 1374.0 -> 1327.0
scene width: 1374.0 -> 1327.0
outer height: 342.0 -> 330.0
scene height: 342.0 -> 330.0
outer width: 1327.0 -> 1290.0
scene width: 1327.0 -> 1290.0
outer height: 330.0 -> 326.0
scene height: 330.0 -> 326.0

显然,在这个玩具示例中,我可以只删除中间的 BorderPane,但是如果我想制作一个可重用、可调整大小的组件来包装 Canvas 怎么办?我怎样才能确保它总是与父母一起调整大小?无论如何,嵌套的 BorderPanes 是怎么回事?

4

1 回答 1

4

Canvas是不可调整大小的节点。min这意味着它的大小是其父级大小的下限。

如果您使用BorderPaneas scene root,则调整窗口大小会强制调整场景大小,调整场景大小会强制调整场景根大小以适合窗口。出于这个原因,父级Canvas缩小到它的min大小以下,并且Canvas缩小了。

如果您将 a 缩小BorderPane到它的min大小以下,它不会强制它的可调整大小的子级调整大小低于其min大小,而是将它们的大小设置为该min大小。这样,BorderPane包裹在 a 中的 aBorderPane永远不会被迫收缩到低于 the 的大小,Canvas并且Canvas永远不会收缩。

您可以通过将 的managed属性设置为在计算大小时不考虑结果Canvas来解决此问题。(请注意,布局根本不考虑非托管子级。因此,您应该将a包装为唯一的子级,以防止对兄弟姐妹产生不良影响。)falseCanvasminCanvasPane

Canvas canvas = ...
canvas.setManaged(false);
Pane canvasParent = new Pane(canvas);
canvas.widthProperty().bind(canvasParent.widthProperty());
canvas.heightProperty().bind(canvasParent.heightProperty());

// TODO: put canvasParent in the scene
于 2018-04-14T08:03:50.840 回答