Java Jtable-滚动至底部,显示高度可变的行

Java Jtable-滚动至底部,显示高度可变的行,java,swing,scroll,jtable,jscrollpane,Java,Swing,Scroll,Jtable,Jscrollpane,我正在尝试自动滚动到一个JTable的底部(在滚动窗格中),该JTable具有可变的行高,并且定期刷新。是否有一个我可以重写的侦听器,或者一个我可以侦听的事件,它将在表格底部的新行重新绘制之后发生 我通过覆盖列的呈现器来实现可变高度,如果列中的文本长度超过以列的宽度在一行中显示的长度,则重置行高度 private void adjustRowHeight( ) { if ( _table == null ) { return; } int cWi

我正在尝试自动滚动到一个JTable的底部(在滚动窗格中),该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
code

在我将行设置为可变高度之前,这引用了行计数而不是MAX_值,但是引用有效行索引使用默认行高度来计算行的位置,而不是可变行高度

 _table.scrollRectToVisible( _table.getCellRect( Integer.MAX_VALUE, 0, true ) );
使用Integer.MAX_值将覆盖默认计算,以使用表格的高度作为矩形的y值。我认为正在发生的事情是,在重新绘制表(和高度重置)之前调用此代码,即使新行已添加到表中。是否有一个事件,我可以听,以知道何时高度已重置在表上,这样我就可以滚动到底部?还是我还遗漏了什么?

有两种方法

  • 使用
    JScrollBar移动

  • 使用
    JViewport
    移动

我也更喜欢这种方式,这样就可以用这个
点及其坐标进行管理

是否有一个我可以重写的侦听器,或者一个我可以侦听的事件,它将在表格底部的新行重新绘制之后发生

是否有一个事件,我可以听,以知道何时高度已重置在表上,这样我就可以滚动到底部

一切都取决于od
ListSelectionModel

是否有一个我可以重写的侦听器,或者一个我可以侦听的事件,它将在表格底部的新行重新绘制之后发生

是否有一个事件,我可以听,以知道何时高度已重置在表上,这样我就可以滚动到底部


对。在JTable的父类中找到,
Component#addComponentListener(ComponentListener)
在这里我可以重写
componentResized
方法。

这并不能回答问题。scrollRectToVisible已经出现,我不需要也不想更改用户的选择。问题是scrollRectToVisible在计算正确的矩形y坐标之前发生。???这个问题我无法从你的代码中得到???,不知道,我的链接代码已经得到了相同的问题,动态获取/设置行坐标,最好将你的onw问题翻译成,以避免任何可能的缺失来自你的代码的其余部分,很抱歉,你的代码中没有包含电池用于编辑。tableChanged方法在渲染器调整行高度之前也会被调用,因此我遇到了相同的问题。通过覆盖列的渲染器以重置行高度来实现可变高度,具体取决于渲染器何时执行此操作,这可能是非常错误的:它不能在GetTableCellRenderComponent中执行此操作。不完全确定这是否是您真正想要的:每次大小更改都会触发事件。如果f.i.用户在查看行的顶部时更改了宽度,当滚动到底部时,他/她可能会非常恼火。谢谢。说得好。用户可以选择“自动滚动”。我原以为这样就可以了,但在滚动到底部之前,我应该检查行数是否也发生了变化。
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) {
                   
                }
            }
        }
    });
}