【发布时间】:2012-10-03 13:16:36
【问题描述】:
我正在尝试自动滚动到具有可变行高并定期刷新的 JTable(在 scrollPane 内)的底部。是否有一个我可以覆盖的监听器,或者一个我可以监听的事件,在表格被重绘并在底部使用新行之后发生?
我实现了可变高度,方法是覆盖列的渲染器以在列中的文本长于在列宽度的一行中显示时重置行高。
private void adjustRowHeight( )
{
if ( _table == null )
{
return;
}
int cWidth = _table.getTableHeader().getColumnModel().getColumn(_column).getWidth();
_textComponent.setSize( new Dimension( cWidth - 2*HORIZONTAL_GAP, MAX_HEIGHT ) );
int prefH = _textComponent.getPreferredSize().height;
boolean isTooBig = prefH > MAX_HEIGHT;
if (isTooBig)
{
prefH = MAX_HEIGHT;
}
_table.setRowHeight(_row, prefH + 2 );
}
我的scrollToBottom 代码如下。
在我使行可变高度之前,它引用了行数而不是 MAX_VALUE,但是引用有效的行索引使用默认行高来计算行的位置,而不是可变行高。
_table.scrollRectToVisible( _table.getCellRect( Integer.MAX_VALUE, 0, true ) );
使用 Integer.MAX_VALUE 会覆盖默认计算以使用 表格的 高度作为矩形的 y 值。我认为正在发生的是,即使新行已添加到表中,在重绘表(并重置高度)之前也会调用此代码。是否有一个事件我可以听以了解何时重置桌子上的高度,然后我可以滚动到底部?还是我在这里缺少其他东西?
【问题讨论】:
-
通过覆盖列的渲染器来重置行高来实现可变高度 - 取决于渲染器这样做的何时,它可能非常错误:它不能在 getTableCellRendererComponent 中这样做
标签: java swing scroll jtable jscrollpane