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

时间:2013-06-25 09:00:21

标签: java swing scroll jtable

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

  

公共地图< Long,MyObject> tableData = new HashMap< Long,MyObject>();

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

tableData.put(id, anObject);

AbstractTableModel atm = (AbstractTableModel)model;
atm.fireTableDataChanged();

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

TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
.
.
.
table.setRowSorter(sorter);

我的目标是(垂直)滚动条总是跳到最后添加的行,这可能是中间的某个地方 因为分拣机可能使用此表:

table.scrollRectToVisible(table.getCellRect(row,0, true)); 

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

1 个答案:

答案 0 :(得分: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);

两个重要方面:

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