使此表布局其行和列。重写的此方法可调整列的大小,以适应包含的父级的大小更改。调整表中一列或多列的大小,以便所有此 jtable
列的总宽度等于表的宽度。
开始布局之前,此方法获取 tableheader
的 resizingcolumn
。当由于要调整封闭窗口的大小而调用此方法时,resizingcolumn
为 null
。这意味着调整大小发生在 jtable
的“外部”,并且更改(或 "delta" )应该分布到所有列,无论此 jtable
的自动调整大小模式如何。
如果 resizingcolumn
不为 null
,则它是发生大小更改的表中的一列,而不是表本身。在这种情况下,自动调整大小模式控制额外(或不足)空间在可用列之间的分布方式。
该模式有:
- auto_resize_off:不自动调整列的宽度。当列的总宽度超过
viewport
的宽度时,使用水平滚动条来适应列的宽度。如果 jtable
没有封闭在 jscrollpane
中,则可能导致该表的一部分不可见。
- auto_resize_min
iis7站长之家_column:使用被调整列的下一列。这导致相邻单元格之间的“边界”或分隔栏是可独立调整的。
- auto_resize_subsequent_columns:使用被调整列后面的所有列来吸收所作的更改。这是默认行为。
- auto_resize_last_column:只自动调整最后一列的大小。如果最后一列的边界导致无法分配所需的大小,则将最后一列的宽度设置为适当的界限并且不再做进一步的调整。
- auto_resize_all_columns:将 delta 分散在
jtable
中的所有列之间,包括正在被调整的列。
注:当 jtable
调整列宽时,它绝对遵守其最小值和最大值。但是即使在调用此方法后,列的总宽度仍然可能不等于表的宽度。发生这种情况时,jtable
不会进入 auto_resize_off 模式来生成一个滚动条,或者中断其当前自动调整模式的其他提交,相反,它允许其边界设置为大于(或小于)最大总宽度(或最小总宽度),这意味着要么没有足够的空间来显示所有的列,要么就是列不能填满 jtable
的边界。这将分别导致在绘制期间,某些列将被剪切掉,或者某个区域将被绘制为 jtable
的背景色。
用于在可用列之间分布 delta 的机制是由 jtable
类中的一个私有方法提供的:
adjustsizes(long targetsize, final resizable3 r, boolean inverse)
以下部分是对它的解释。resizable3
是一个私有接口,它允许包含元素(具有大小、首选大小、最大大小和最小大小)集合的任何数据结构可以通过该算法来操作其元素。
分布 delta
概述
将 r 中各元素的目标大小与首选大小总和之间的差值称为 "delta"。单独的大小通过将原始首选大小加上 delta 的共享部分来计算,该共享部分基于每个首选大小到其限定边界的距离(最小值或最大值)。
定义
单独的约束称为 min[i]、max[i] 和 pref[i]。
它们相应的和称为:min、max 和 pref。
用以下公式计算每个新大小:
size[i] = pref[i] + delta[i]
其中每个单独的 delta[i] 根据以下条件计算:
如果 (delta < 0),则处于收缩模式,其中:
delta
delta[i] = ------------ * (pref[i] - min[i])
(pref - min)
如果 (delta > 0),则处于扩展模式,其中:
delta
delta[i] = ------------ * (max[i] - pref[i])
(max - pref)
总体效果是总大小向总的最小值或最大值移动相同的百分比 k,此百分比确保适应所需的间距,即 delta。
详细信息
估计此处给出的公式计算易受累积舍入误差的影响,该误差是由此操作的有限精度(使用 int)引起的。为了处理此问题,要经常重新计算上述乘数,这可将以前迭代中的舍入误差考虑在内。结果是一个生成一组整数的算法,这组整数值的和恰好等于提供的 targetsize
,这是通过将舍入误差均匀分散到给定元素上来实现的。
何时选中 max 和 min 边界
当 targetsize
处于 [min, max] 范围外时,算法将所有大小设置为其适合的限定值(最大值或最小值)。
- 覆盖:
- 类
container
中的 dolayout
- 另请参见:
layoutmanager.layoutcontainer(java.awt.container)
,
container.setlayout(java.awt.layoutmanager)
,
container.validate()