在视口中保持JTable选择

时间:2009-03-17 22:53:44

标签: java scroll jtable glazedlists

我正在使用GlazedLists从EventList自动生成EventTableModel,以便与JScrollbarPane中的JTable一起使用。

我使用EventList作为FIFO,最后添加了一堆元素,然后有时从一开始就删除了一堆元素。删除元素时,选择的工作方式与我预期的完全相同:即使选择的索引已更改,也会选择相同的元素(或至少选择仍在表中的元素)。太棒了。

显然,如果对象由于在开头删除项目而改变其索引,则不可能保持视口显示固定范围的对象和固定范围的索引。默认行为似乎是保持视口不变。

如果我想将所选对象保持在视口中的相同位置,有没有办法可以做到这一点? (例如,在EventTableModel或JScrollbarPane或其他东西上设置事件监听器,并计算正确的滚动条设置,以便当我从头开始删除项目时,视口随对象一起移动?)

3 个答案:

答案 0 :(得分:1)

如果我正确调用,JQuery上有一个JViewport使用的方法 当您在Jtable中使用箭头键时,它会进行实际滚动

public void scrollRectToVisible(Rectangle aRect)

这样你就不需要调整滚动条了,但你明确地说明了应该看到哪个rect。可以包括基于单行的行数和像素高度的一些计算。 您还可以在此方法中放置一个断点,并在使用箭头键通过Jtable移动时检查它是如何工作的

答案 1 :(得分:0)

在ScrollPane内部显示JTable中第一个选定行的另一种方法是手动设置垂直滚动条显示的内容:

首先,获取表格中的第一个选定行。如果选择了多行,这仍然只是抓住第一行。

int firstSelectedRow = table.getSelectedRow();

然后,获取所选行在表格中的位置(y坐标)。

Rectangle cellLocation = table.getCellRect(firstSelectedRow, 0, false);

最后,我们可以告诉垂直滚动条在哪里。

scrollPane.getVerticalScrollBar().setValue(cellLocation.y);

此外,如果没有选定的行,这将使视口显示在表的顶部。

我宁愿使用scrollRectToVisible()方法,但由于某种原因,它不适合我,这似乎每次都有效。

答案 2 :(得分:0)

这是另一种解决方案,仅取决于表格。此解决方案还会在新视图中保留所选行的y位置。

首先,我们要存储更新前视图和选择矩形

Rectangle preUpdateViewRect = table.getVisibleRect();
Rectangle preUpdateSelectedCellRect = table.getCellRect( table.getSelectedRow(), 1, true );

更新后,检查我们的选择是否在视图中。此检查确保如果用户选择一行并开始滚动,我们不会将视图捕捉回选择。如果选择在我们的视图中,请执行一些简单的数学运算来创建在我们视图中的同一位置具有所选内容的矩形。

if( preUpdateViewRect != null && preUpdateViewRect.contains( preUpdateSelectedCellRect ))
{
    Rectangle postUpadteSelectedCellRect = table.getCellRect( table.getSelectedRow(), 1, true );
    int newViewPortY = postUpdateSelectedCellRect.y - ( preUpdateSelectedCellRect.y - preUpdateViewRect.y );
    Rectangle newViewRect = new Rectangle( preUpdateViewRect.x, newViewPortY , preUpdateViewRect.width, preUpdateViewRect.height );
    table.scrollRectToVisible( newViewRect );
}