Jtable - 滚动到底部,可变高度行

时间:2012-10-12 17:04:26

标签: java swing scroll jtable jscrollpane

我正在尝试自动滚动到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值。我认为正在发生的是,在重新绘制表(以及高度重置)之前调用此代码,即使已将新行添加到表中。是否有一个事件,我可以听到知道何时高度已经重置在桌子上,所以我可以滚动到底部?或者我在这里还缺少什么?

2 个答案:

答案 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方法。

相关问题