【问题标题】:Scroll to last added row in JTable滚动到 JTable 中最后添加的行
【发布时间】:2013-06-22 00:05:09
【问题描述】:

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

public Map tableData = new HashMap();

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

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

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

【问题讨论】:

  • 不相关:a) 永远不会代表模型触发事件,而是通过修改 api 来实现自定义模型,从而实现其通知合同本身 b) 始终触发可能的最窄事件,菲更新/插入(与 shotgun dataChanged 相比)c)如果您的 rowSorter 只是普通核心版本,请考虑使用 table.setAutoCreateRowSorter(true) 而不是手动创建和设置它

标签: java swing scroll jtable


【解决方案1】:

滚动到潜在排序表中新插入的行涉及

  • 监听表模型的变化
  • 将事件的 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
  • 同时调用索引转换和滚动可确保表(也正在侦听模型)已根据模型更改更新了所有内部状态。

【讨论】:

  • f.i.在模型的监听器中
  • @kleopatra hm,但在听众中我不知道 modelRow
  • +1 表示convert*;更多滚动到最后一行的例子可以在here找到。
  • @user1703554 你的模型实现必须返回一个稳定的顺序,即 f.i.它必须知道它向外界报告的序列中的哪个位置添加了新行,然后触发该索引,而与底层数据结构无关。否则它不是一个有效的实现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-13
  • 2015-11-22
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 2012-08-27
  • 1970-01-01
相关资源
最近更新 更多