0

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

public Map< 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)); 

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

4

1 回答 1

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
  • 同时调用索引转换和滚动可确保表(也正在侦听模型)已根据模型更改更新了所有内部状态。
于 2013-06-25T09:16:35.450 回答