我正在尝试自动滚动到JTable的底部(在scrollPane内部),该JTable具有可变行高并且会定期刷新。是否有一个我可以覆盖的监听器,或者我可以监听的事件,在表重新绘制后,底部的新行会发生这种情况吗?
如果列中的文本比列中宽度的一行显示的长,则通过覆盖列的渲染器来重置行高来实现变量高度。
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值。我认为正在发生的是,在重新绘制表(以及高度重置)之前调用此代码,即使已将新行添加到表中。是否有一个事件,我可以听到知道何时高度已经重置在桌子上,所以我可以滚动到底部?或者我在这里还缺少什么?
答案 0 :(得分:2)
有两种方式,
使用JScrollBar
使用JViewport
,
我也喜欢这种方式,然后可以使用此Point
及其坐标for example
是否有一个我可以覆盖的侦听器,或者我可以听到的事件,在使用底部的新行重绘表后会发生这种情况?
是否有一个事件我可以听到知道什么时候在桌子上重置了高度,所以我可以滚动到底部?
private void addTableListener() {
model.addTableModelListener(new TableModelListener() {
@Override
public void tableChanged(TableModelEvent tme) {
if (table.getRowCount() > 0) {
if (tme.getType() == TableModelEvent.INSERT) {
} else if (tme.getType() == TableModelEvent.DELETE) {
} else if (tme.getType() == TableModelEvent.UPDATE) {
}
}
}
});
}
一切都取决于ListSelectionModel
,
答案 1 :(得分:0)
是否有一个我可以覆盖的侦听器,或者我可以听到的事件,在使用底部的新行重绘表后会发生这种情况?
是否有一个事件我可以听到知道什么时候在桌子上重置了高度,所以我可以滚动到底部?
是。在JTable的父类Component#addComponentListener( ComponentListener )
中找到,我可以覆盖componentResized
方法。