3 回答
TA贡献2021条经验 获得超8个赞
但是,这种检测似乎为时过早。
为了强调(@trashgod已经在评论中提到了它):是的,这是预期的,也是Swing中一个相当普遍的问题:-)
该表-以及具有任何模型的任何其他视图,不仅是数据,还包括选择,调整...-正在监听模型以进行自我更新。因此,自定义侦听器只是该行中的另一个侦听器(未定义服务顺序)。如果要执行依赖于视图状态的操作,则必须确保在所有内部更新准备就绪后执行此操作(在此具体上下文中,内部更新包括垂直scrollBar的adjustmentModel的更新)推迟自定义处理通过包装SwingUtilities.invokeLater直到完成内部操作为止:
TableModelListener l = new TableModelListener() {
@Override
public void tableChanged(TableModelEvent e) {
if (e.getType() == TableModelEvent.INSERT) {
invokeScroll();
}
}
protected void invokeScroll() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
int last = table.getModel().getRowCount() - 1;
Rectangle r = table.getCellRect(last, 0, true);
table.scrollRectToVisible(r);
}
});
}
};
table.getModel().addTableModelListener(l);
TA贡献1828条经验 获得超6个赞
我认为这可能有助于我理解@trashgod所说的话我没得到的东西。他提到invokeLater像您一样将滚动调用包装在一个包装中,我认为这将无法完成任何事情,因为我的整个程序已经在这种包装中。我现在注意到包装器创建了一个new Runnable,我猜这是实现他所谈论的“排序”的要素,从而保证了这个新的runnable不会在另一个runnable中的下一行完成之前运行。完全正确吗?
添加回答
举报