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

时间:2017-09-21 22:43:41

标签: eclipse eclipse-rcp nattable

我有一个动作将NatTable滚动到选定的行。我试图使用下面的代码片段

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

如果我将delta值设置为 rowPosition + 10 ,则有效。但是,如果当前滚动位于表格的底部,则它不会向上滚动到该行,它需要额外的滚动才能看到选择。从逻辑上讲,我需要 rowPosition-10 来向上滚动到正确的位置。

因此,我们需要找到滚动位置位于表格的末尾或表格的开头,然后相应地设置 rowPosition + 10或rowPosition-10 。 有没有办法找到当前的滚动位置?

这与问题Scroll NatTable programmatically类似。遗憾的是,没有评论的声誉,因此为这个问题创建了一个单独的主题。

感谢是否有人解决了这个问题可以发布答案。

谢谢。

2 个答案:

答案 0 :(得分:1)

我刚遇到与原版海报相同的情况。在玩了一段时间之后我才意识到,ShowRowInViewportCommand将尽可能地“滚动”视口以使行可见。三个先决条件之一将是真的:

  • (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;
}

答案 1 :(得分:0)

您的问题标题具有误导性。这似乎与选择无关。

实际问题是如何找到当前滚动位置。您可以向ViewportLayer询问最后显示的行,看看是否显示了索引最高的行。在那种情况下,你就在最后。

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