以编程方式将 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;
}
我有一个将 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;
}