【问题标题】:Jtable - scroll to bottom with variable height rowsJtable - 使用可变高度行滚动到底部
【发布时间】: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


【解决方案1】:

有两种方法,

  • 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

【讨论】:

  • 这没有回答问题。 scrollRectToVisible 已经发生,我既不需要也不想更改用户的选择。问题是 scrollRectToVisible 在计算出正确的矩形 y 坐标之前发生。
  • ???这个问题我不能从你的代码中得到???,不知道,我的链接代码也有同样的问题,即时获取/设置行坐标,最好将你的 onw 问题翻译成SSCCE,以避免任何可能的缺失都来自您的代码的其余部分,抱歉,此处发布的代码中未包含电池
  • 感谢编辑。在我的渲染器调整行高之前也会调用 tableChanged 方法,所以我遇到了同样的问题。
【解决方案2】:

在用底部的新行重绘表格后,是否有我可以覆盖的侦听器或我可以侦听的事件?

是否有一个事件可以让我知道何时重置桌子上的高度,以便我可以滚动到底部?

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

【讨论】:

  • 不完全确定这是否是您真正想要的:每次更改大小都会触发该事件。如果 f.i.用户在查看行的顶部时会更改宽度,当滚动到底部时,他/她可能会非常恼火。
  • 谢谢。好点子。用户可以选择“自动滚动”。我想这会涵盖它,但我可能应该在滚动到底部之前检查行数是否也发生了变化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-29
  • 1970-01-01
  • 2014-02-27
  • 2015-12-21
  • 1970-01-01
  • 2019-07-18
  • 1970-01-01
相关资源
最近更新 更多