我使用JTable
来显示数据。当以编程方式选择行时,它应该(自动)将该行滚动到视图中,以便它是顶部的第一行。为此,我有以下方法:
private static void scrollToSelectedRow(JTable table)
{
JViewport viewport = (JViewport) table.getParent();
Rectangle cellRectangle = table.getCellRect(table.getSelectedRow(), 0, true);
Rectangle visibleRectangle = viewport.getVisibleRect();
table.scrollRectToVisible(new Rectangle(cellRectangle.x, cellRectangle.y, (int) visibleRectangle.getWidth(), (int) visibleRectangle.getHeight()));
}
问题是调用它可能会也可能不会正确滚动,例如所选行可以以非确定性方式在顶部或不在顶部。为了解决这个问题,我尝试了两次延迟调用方法并重新绘制它:
public static void setSelectedRow(JTable table, int rowIndex, int columnIndex)
{
table.setRowSelectionInterval(rowIndex, columnIndex);
scrollToSelectedRow(table);
try
{
Thread.sleep(100);
} catch (InterruptedException exception)
{
exception.printStackTrace();
}
scrollToSelectedRow(table);
table.repaint();
}
这样做效果要好得多,但有时仍然会将表格列出来,因为显然在更新时暂停EDT
是不明智的。 repaint()
调用似乎可以阻止行重叠"以类似的方式。通过将鼠标移动到受影响的行/列上可以轻松修复图形毛刺,但不应该发生。
如何在不等待和没有图形故障的情况下优雅地执行滚动操作?
答案 0 :(得分:3)
代码看起来很合理。通常的技巧是确保Rectangle width / height是视口的大小以强制滚动。
两个想法。
摆脱Thread.sleep()。所做的就是阻止GUI重新绘制100ms。
尝试将@IBAction func addToMap(_ sender: Any) {
let lat = Double(latitudeField.text!)
let long = Double(longitudeField.text!)
self.coordinates.append(CLLocationCoordinate2D(latitude: lat!, longitude: long!))
//here we pass the coordinate array to mapViewController
if let mapViewController = self.tabBarController?.viewControllers?[1] as? MapViewController
{
mapViewController.coordinates = self.coordinates
}
}
包裹在scrollRectToVisible(...)
。
如果第2点没有帮助,则发布一个证明问题的正确[mcve]。