我正在尝试调整一个scene2d.ui窗口(基本上是一个可以移动的表)及其内容的大小。到目前为止,我只能成功地更改窗口大小本身,而不是其内容。我是这样做的:
window.setWidth(newTableWidth);
textField.setWidth(newFieldWidth);
window.invalidate(); <--- New size of window is drawn properly when invalidate() is called
textField.invalidate(); <--- New textField size is NOT drawn, however
在这种情况下,窗口包含一个文本字段,我正在尝试与窗口一起调整大小,但只有窗口以其新大小重新绘制,而文本字段保持不变。
如何正确更新窗口中的小部件?
答案 0 :(得分:15)
我遇到了同样的问题,需要一段时间才能得到解决方案。 看看这个问题slider always has default width。
解决方案是:
UI小部件不会设置自己的大小和位置。相反,父窗口小部件设置每个子项的大小和位置。窗口小部件提供父级可用作提示的最小,首选和最大大小。某些父窗口小部件(如Table)可以为如何调整子项的大小和位置提供约束。要在窗体中为窗口小部件指定特定大小,窗口小部件的最小,首选和最大大小将保持不变,并且在父窗口中设置大小约束。
Layout at Wiki
来自libGDX的维基。他们刚刚添加了它。因此,当您将这些小部件添加到表格时,只需在末尾添加行.width(newTableWidth)
,它应该是正确的宽度。
table.add(textField).width(600).height(60);
答案 1 :(得分:1)
根据BeenX的回答,很明显,大小是在包含小部件的表格的单元格上设置的,而不是在小部件本身上。 table.add()
方法返回一个单元格,因此在运行table.add(textField).width(600).height(60)
时,宽度和高度将应用于此单元格。
因此,我更新现有单元格的解决方案是找到我想用table.getCells()
更新的单元格,然后在其上应用新宽度。下面的示例更改列表中最后一个单元格的宽度。
List<Cell> cells = window.getCells();
Cell cell = cells.get(cells.size()-1);
cell.width(newWidth);