使用Jtextarea作为呈现组件时会遇到几个问题(大多数(如果不是全部的话)已经在此站点上的多个QA中进行了解释)。尝试总结一下:
将各个行的高度调整为渲染组件的大小要求
基本上,方法是根据需要遍历各个单元,然后
- 使用数据配置其渲染器
- 向渲染组件询问其首选大小
- 将表格行高度设置为首选高度
OP的已编辑问题中的updateRowHeight方法很好。
Jtextarea计算的preferredSize
为了获得一个尺寸的合理尺寸提示,需要在另一个尺寸的尺寸“合理”地填充它。也就是说,如果我们想要高度,则需要宽度,并且必须在每次调用中完成。在表的上下文中,合理的宽度是当前列的宽度:
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { ... // configure visuals setText((String) value); setSize(table.getColumnModel().getColumn(column).getWidth(), Short.MAX_VALUE); return this;}// getTableCellRendererComponent动态调整高度
在表格/列/模型的某些稳定状态下,行高度完全确定。因此,您可以在初始化完成后设置它(调用updateRowHeight),并且只要它依赖的任何状态发生更改即可。
// TableModelListener@Overridepublic void tableChanged(TableModelEvent e) { updateRowHeights();}// TableColumnModelListener@Overridepublic void columnMarginChanged(ChangeEvent e) { updateRowHeights();}注意
通常,getXXRendererComponent中的所有参数都是严格只读的,实现 不得 更改调用方的任何状态。从渲染器内部更新rowHeight是
错误的 。



