我有一个包含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的交易是什么?
答案 0 :(得分:2)
Canvas
是一个不可调整大小的节点。这意味着它的大小是其父级min
大小的下限。
如果使用BorderPane
作为场景根,则调整窗口大小会强制调整场景大小并调整场景大小,强制调整场景根大小以适合窗口。出于这个原因,Canvas
的父级缩小到它min
以下,Canvas
缩小了。
如果缩小BorderPane
以下min
尺寸,则不会强制其可调整大小的儿童调整到min
尺寸以下,但会设置其尺寸改为min
大小。这样,BorderPane
中包含的BorderPane
永远不会被强制缩小到Canvas
以下,而Canvas
永远不会缩小。
您可以通过将managed
的{{1}}属性设置为Canvas
来解决此问题,从而导致在计算false
尺寸时未考虑Canvas
。 (请注意,根本不考虑非托管子项的布局。因此,您应该将min
作为唯一的子项包装在Canvas
中,以防止对兄弟姐妹产生不良影响。)
Pane