0

我正在尝试自动滚动到具有可变行高并定期刷新的 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 值。我认为正在发生的是,即使新行已添加到表中,在重绘表(并重置高度)之前也会调用此代码。是否有一个事件我可以听以了解何时重置桌子上的高度,然后我可以滚动到底部?还是我在这里缺少其他东西?

4

2 回答 2

2

有两种方法,

  • 搬家JScrollBar

  • 移动JViewport

我也更喜欢这种方式,然后可以使用Point它及其坐标进行管理,例如

是否有一个我可以覆盖的监听器,或者一个我可以监听的事件,这将在表格被重绘并在底部使用新行之后发生?

是否有一个事件我可以听以了解何时重置桌子上的高度,然后我可以滚动到底部?

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) {
                   
                }
            }
        }
    });
}

一切都取决于 od ListSelectionModel,

于 2012-10-12T17:12:44.270 回答
0

是否有一个我可以覆盖的监听器,或者一个我可以监听的事件,这将在表格被重绘并在底部使用新行之后发生?

是否有一个事件我可以听以了解何时重置桌子上的高度,然后我可以滚动到底部?

是的。在 JTable 的父类中找到,Component#addComponentListener( ComponentListener )我可以在其中覆盖该componentResized方法。

于 2012-10-12T18:35:36.110 回答