以编程方式将 NatTable 滚动到选定的行

Scroll NatTable programmatically to the selected Row

我有一个将 NatTable 滚动到选定行的操作。我尝试使用部分有效的以下代码片段

natTable.doCommand(new ShowRowInViewportCommand(
natTable.getBodyLayer().getViewportLayer(), rowPosition+delta));

如果我将增量​​值设置为 rowPosition+10,它会起作用。但是,如果当前滚动位于 table 的底部,它不会向上滚动到该行,它需要额外滚动才能看到选择。从逻辑上讲,我需要执行 rowPosition-10 才能向上滚动到正确的位置。

所以,我们需要找到滚动位置在table的末尾或table的开始,然后设置rowPosition+10或rowPosition-10 相应地。 有没有办法找到当前的滚动位置??

这与此处的问题 Scroll NatTable programmatically 类似。不幸的是,没有评论的声誉,因此为这个问题创建了一个单独的线程。

如果有人解决了这个问题,我将不胜感激 post 答案。

谢谢。

您的问题标题具有误导性。好像跟选择无关

真正的问题是如何找到当前的滚动位置。您可以向 ViewportLayer 询问最后显示的行,看看是否显示了具有最高索引的行。那样的话你就到最后了。

或者您检查滚动条状态。它与 NatTable 无关,而且是一般的 SWT 主题。

我刚刚 运行 遇到了与发帖人相同的情况。在玩了一会儿之后我开始意识到 ShowRowInViewportCommand 将尽可能少地 "Scroll" 视口以使该行可见。三个先决条件之一为真:

  • (A) 目标行已经可见(在这种情况下什么也不会发生,可见的目标行保持在原处);
  • (B) 目标行在视口下方(在这种情况下视口向下滚动,以便目标行位于视口底部)
  • (C) 目标行在视口上方(在这种情况下,视口向上滚动,以便目标行位于顶部或视口)。

在我的用例中,如果当前不可见,我希望目标行位于视口的中心(如果可见,则保留在原处)。

为此,我正在计算应位于视口顶行的对象的索引并发出 doCommand()。这对案例 (C) 很有效,但对 (B) 却失败了。修复只是简单地识别视口是向上还是向下,然后相应地计算正确的顶部或底部索引。

滚动的方向可以通过类似于(其中 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;
}