滚动到JTable中的最后添加的行

use*_*554 0 java swing scroll jtable

我使用HashMap来填充一个或多或少不断更新的JTable:

public Map <Long,MyObject> tableData = new HashMap <Long,MyObject>();

每次将新元素添加到地图时,都会通知表模型:

tableData.put(id, anObject);

AbstractTableModel atm = (AbstractTableModel)model;
atm.fireTableDataChanged();
Run Code Online (Sandbox Code Playgroud)

另外,我有一个TableRowSorter,它根据特定条件对行进行排序:

TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
.
.
.
table.setRowSorter(sorter);
Run Code Online (Sandbox Code Playgroud)

我的目标是(垂直)滚动条始终跳转到最后添加的行,由于分拣机可能使用此行,因此可能位于表格的中间位置:

table.scrollRectToVisible(table.getCellRect(row,0, true)); 
Run Code Online (Sandbox Code Playgroud)

问题是我不知道行的索引:)我可以在哪里获取此索引?

kle*_*tra 8

滚动到可能已排序的表中新插入的行涉及

  • 听取表格模型的变化
  • 转换事件的rowIndex(它在模型协调中)以查看坐标
  • 滚动到视图位置

在代码中:

final JTable table = new JTable();
TableModelListener l = new TableModelListener() {

    @Override
    public void tableChanged(TableModelEvent e) {
        if (TableUtilities.isInsert(e)) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    int viewRow = table.convertRowIndexToView(e.getFirstRow());
                    table.scrollRectToVisible(table.getCellRect(viewRow, 0, true));    
                }
            });
        }
    }
};
table.getModel().addTableModelListener(l);
Run Code Online (Sandbox Code Playgroud)

两个重要方面:

  • 您的模型实现必须触发正确的事件,即插入,而不是dataChanged
  • 调用索引转换和滚动保证表(也正在监听模型)根据模型更改更新了所有内部状态.