我有一个将 NatTable 滚动到所选行的操作。我尝试使用下面的代码片段,该代码片段部分有效
natTable.doCommand(new ShowRowInViewportCommand(
natTable.getBodyLayer().getViewportLayer(), rowPosition+delta));
如果我将增量值设置为 rowPosition+10,它就会起作用。但是,如果当前滚动位于表格底部,则它不会向上滚动到该行,它需要额外的滚动才能查看选择。从逻辑上讲,我需要执行 rowPosition-10 才能将滚动到正确的位置。
因此,我们需要找到滚动位置是在表格末尾还是表格开头,然后相应地设置rowPosition+10或rowPosition-10。 有没有办法找到当前滚动位置?
这类似于问题Scroll NatTable programmatically这里。不幸的是,没有声誉发表评论,因此为这个问题创建一个单独的线程。
如果有人解决了这个问题,可以发布答案,谢谢。
谢谢。
最佳答案
我刚刚遇到了与原始海报相同的情况。在玩了一段时间后我意识到 ShowRowInViewportCommand 将尽可能少地“滚动”视口(viewport)以使行可见。三个先决条件之一为真:
- (A) 目标行已经可见(在这种情况下什么都不会发生,可见的目标行保持在原来的位置);
- (B) 目标行位于视口(viewport)下方(在这种情况下,视口(viewport)向下滚动,以便目标行位于视口(viewport)底部)
- (C) 目标行位于视口(viewport)上方(在这种情况下,视口(viewport)向上滚动,以便目标行位于视口(viewport)顶部)。
在我的用例中,如果目标行当前不可见,我希望目标行位于视口(viewport)的中心(如果目标行可见,则位于其所在位置)。
为此,我计算了应该位于视口(viewport)顶行的对象的索引并发出 doCommand()。这对于情况 (C) 来说效果很好,但对于情况 (B) 则失败了。修复方法只是识别视口(viewport)是否要向上或向下,然后相应地计算正确的顶部或底部索引。
滚动的方向可以通过类似于以下的代码来确定(其中 dataIndex 是我想要使其可见的行(在我的基本数据集中)的索引:
int viewportPosition = bodyLayerStack.viewportLayer.getRowPositionByIndex(dataIndex);
int viewportHeight = bodyLayerStack.viewportLayer.getRowCount();
boolean isVisible = (viewportPosition >= 0) && (viewportPosition < viewportHeight);
if (!isVisible) {
if (viewportPosition < 0) {
/*
* The target row is below the viewport window so we want to calculate the
* index of the bottom of the table.
*/
viewPortTargetPosition = dataIndex - (viewportHeight / 2) + columnHeaderLayer.getRowCount();
viewPortTargetPosition = Math.max(0, viewPortTargetPosition);
}
else {
/*
* The target row is above the viewport window so we want to calculate the
* index of the top row to show in the viewport.
*/
viewPortTargetPosition = Math.min(dataIndex + (viewportHeight / 2) - 1, bodyLayerStack.bodyDataLayer.getRowCount()-1);
}
natTable.doCommand(new ShowRowInViewportCommand(bodyLayerStack.viewportLayer, viewPortTargetPosition));
return true;
}
关于eclipse - 以编程方式滚动 NatTable 到选定的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46354237/