如何在窗口/表格中更改现有scene2d.ui小部件的大小?

时间:2013-08-30 18:10:08

标签: libgdx

我正在尝试调整一个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

在这种情况下,窗口包含一个文本字段,我正在尝试与窗口一起调整大小,但只有窗口以其新大小重新绘制,而文本字段保持不变。

如何正确更新窗口中的小部件?

2 个答案:

答案 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);