我正在尝试以将新数据记录添加到末尾的方式使用 JTable
。奇怪的是滚动条没有走到表格的末尾;相反,它总是显示倒数第二个。有什么方法可以让滚动条始终移动到表格的末尾?
这是我的部分代码:
table.scrollRectToVisible(table.getCellRect(table.getRowCount()-1, 0, true));
最佳答案
我刚遇到这个问题——那行代码实际上没有任何问题;问题在于您何时执行它。
如果您像我一样尝试在操作 TableModel(甚至通过 invokeLater)或使用 TableModelListener 后立即执行它,您将获得你描述的问题。问题是,虽然模型已使用新数据更新(table.getRowCount() 只是传递给 getRowCount() 方法>TableModel),JTable 组件在视觉上没有。
当您在前面描述的位置执行该行代码时,您实际上是在尝试告诉 JScrollPane(JTable.scrollRectToVisible 将任何操作推迟到父级可以提供滚动行为,例如 JScrollPane) 滚动到封闭的 JTable 组件的末尾之外。它拒绝这样做,而是滚动到 JTable 组件的当前末尾。
稍后,JTable 组件会在视觉上更新自身,并将新添加的行添加到滚动到之前的行下方。您可以通过添加一个独立于添加新行的代码执行它的按钮来验证该行代码是否有效,例如
private JTable _table = new JTable();
...
JButton b = new JButton("Force scroll to bottom");
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
_table.scrollRectToVisible(_table.getCellRect(_table.getRowCount()-1, 0, true));
}
});
this.add(b);
这个问题的解决方案有点间接,但在我的测试中确实有效。因为问题出在事物的视觉方面,所以我决定改用 ComponentListener,它提供了一个 componentResized 方法。每当添加或删除一行时,JTable 都会调整大小,即使由于 JScrollPane 的 视口(viewport)而无法在视觉上看到也是如此。因此,只需在该监听器方法中运行该行代码,事情就会按预期进行。
private JTable _table = new JTable();
...
_table.addComponentListener(new ComponentAdapter() {
public void componentResized(ComponentEvent e) {
_table.scrollRectToVisible(_table.getCellRect(_table.getRowCount()-1, 0, true));
}
});
关于java - 如何滚动到 JTable 中的最后一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4890282/