Я только что столкнулся с этой проблемой - на самом деле нет ничего плохого в этой строке кода; проблема заключается в том, когда вы его выполняете.
Если вы, как и я, пытаетесь выполнить его сразу после манипулирования 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 изменяется, даже если он не виден визуально из-за области просмотра *1040* JScrollPane. Поэтому просто запустите эту строку кода в этом методе слушателя, и все будет работать как положено.
private JTable _table = new JTable();
...
_table.addComponentListener(new ComponentAdapter() {
public void componentResized(ComponentEvent e) {
_table.scrollRectToVisible(_table.getCellRect(_table.getRowCount()-1, 0, true));
}
});