0

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

我将 EventList 用作 FIFO,将一堆元素添加到末尾,然后有时会从开头删除一堆元素。删除元素后,选择的工作方式与我预期的完全一样:即使选择的索引已更改,仍会选择相同的元素(或至少选择仍在表中的元素)。这很棒。

显然,如果对象因一开始就删除项目而改变了它们的索引,则不可能保持视口显示固定范围的对象和固定范围的索引。默认行为似乎是保持视口不变。

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

4

3 回答 3

1

if i call correctly there is a method on JComponent which is used by JViewport which does the actual scrolling when you use the arrowkeys in a Jtable

public void scrollRectToVisible(Rectangle aRect)

this way you wouldn't need to adjust scrollbars, but you specifically can state what rect should be visible. Could include some calculation based on the row number and pixel height of a single row. You could also put a breakpoint in this method, and chech how it works when moving with the arrow keys through a Jtable

于 2009-07-30T12:01:16.303 回答
0

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

因此,首先,获取表中的第一个选定行。如果选择了多行,这仍然会抓取第一行。

int firstSelectedRow = table.getSelectedRow();

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

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

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

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

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

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

于 2010-06-14T17:16:28.477 回答
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 );
}
于 2014-02-18T15:10:33.907 回答