我有一个动作将NatTable滚动到选定的行。我试图使用下面的代码片段
natTable.doCommand(new ShowRowInViewportCommand(
natTable.getBodyLayer().getViewportLayer(), rowPosition+delta));
如果我将delta值设置为 rowPosition + 10 ,则有效。但是,如果当前滚动位于表格的底部,则它不会向上滚动到该行,它需要额外的滚动才能看到选择。从逻辑上讲,我需要 rowPosition-10 来向上滚动到正确的位置。
因此,我们需要找到滚动位置位于表格的末尾或表格的开头,然后相应地设置 rowPosition + 10或rowPosition-10 。 有没有办法找到当前的滚动位置?
这与问题Scroll NatTable programmatically类似。遗憾的是,没有评论的声誉,因此为这个问题创建了一个单独的主题。
感谢是否有人解决了这个问题可以发布答案。
谢谢。
答案 0 :(得分:1)
我刚遇到与原版海报相同的情况。在玩了一段时间之后我才意识到,ShowRowInViewportCommand将尽可能地“滚动”视口以使行可见。三个先决条件之一将是真的:
在我的用例中,我希望目标行位于视口的中心(如果它当前不可见)(或者如果它可见则保留在它的位置)。
为此,我计算了应该在视口顶行并发出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主题无关。