【问题标题】:Scroll NatTable programmatically to the selected Row以编程方式滚动 NatTable 到选定的行
【发布时间】:2018-03-03 09:56:57
【问题描述】:

我有一个将 NatTable 滚动到所选行的操作。我尝试使用以下部分工作的 sn-p

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

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

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

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

如果有人解决了这个问题可以发布答案。

谢谢。

【问题讨论】:

    标签: eclipse eclipse-rcp nattable


    【解决方案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;
    }
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 问题是codeShowRowInViewportCommand(natTable.getBodyLayer().getViewportLayer(), rowPosition)); code 最好滚动到 rowPosition。相反,滚动错位并且 rowPosition 不可见。我正在使用的解决方案是一种解决方法,因此 nattable 滚动到适当的行。我还没有设法以编程方式滚动到特定的行。
      • 要么您报告错误,因为您说该功能无法按应有的方式工作。而且我不认为这是默认配置的情况。要么你没有正确使用它,例如对索引和位置的误解,或者您正在使用自动换行和动态高度计算以及可能导致类似问题的附加功能。没有足够的信息,问题指向别的东西。
      • 很抱歉没有正确地提出问题。这是eclipse.org/forums/index.php/t/1066912 中已报告的问题。如答案stackoverflow.com/questions/17593049/… 中所述。我期待使用 ShowRowInViewportCommand 将使用 rowPosition 更新视图。如果我错了,如果我对功能的理解不正确,请纠正我。我的用例是一个简单的“链接到行”操作,类似于包资源管理器中的“链接到编辑器”。因此,当用户单击此操作时,关联的 Row 在 NatTable 中是可见的。
      • 如前所述,您没有提供足够的信息。它应该完全按照描述工作。
      • 我有一个 FullFeaturedBodyStackLayer 并根据用户在 nattable 中的选择更新属性视图。对于大于 500 行的大型数据集,如果用户向上或向下滚动表格,则所选行不可见。因此,我提供了“链接到行”操作来更新 natTable 视图以显示 selectedRow。 ShowRowInViewportCommand(natTable.getBodyLayer().getViewportLayer(), rowPosition));不滚动到选定的行。我从 SelectionLayer 获取 rowPosition 并返回正确的 rowPosition。有没有办法修复视图?
      猜你喜欢
      • 2013-07-09
      • 1970-01-01
      • 2013-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-16
      • 2011-01-15
      相关资源
      最近更新 更多