JTable滚动到行问题

时间:2018-03-21 19:49:44

标签: java swing user-interface scroll

我有以下方法:

public void scrollToVisibleInstructionBlock(JTable table, int rowIndex, int sizeOfBlock) {
    if (!(table.getParent() instanceof JViewport))
        return;
    JViewport viewport = (JViewport) table.getParent();
    Rectangle rect = table.getCellRect(rowIndex, 0, true);
    Point pt = viewport.getViewPosition();
    rect.setLocation(rect.x - pt.x, rect.y - pt.y);
    viewport.scrollRectToVisible(rect);
    table.setRowSelectionInterval(rowIndex, rowIndex + sizeOfBlock - 1);
}

功能很好但不是最佳的。我输入要滚动的行,它选择sizOfBlock行并将它们带入感知。

问题是行始终在表格底部可见。例如:

enter image description here

如您所见,所选行位于表格的底部。我怎么可能把选中的行带到顶部或中间?

由于

3 个答案:

答案 0 :(得分:1)

JViewport viewport = (JViewport) table.getParent();
Rectangle rect = table.getCellRect(rowIndex, 0, true);
Point pt = viewport.getViewPosition();
rect.setLocation(rect.x - pt.x, rect.y - pt.y);
viewport.scrollRectToVisible(rect);

我总是在要滚动的组件上使用scrollRectTovisible(...):

Rectangle rect = table.getCellRect(rowIndex, 0, true);
table.scrollRectToVisible(rect);

如果该行位于当前视口位置下方,则您将滚动到底部。

如果该行位于当前视口位置上方,则您将滚动到顶部。

如果矩形在当前视口中,则不进行滚动。

没有真正帮助解决您的问题,只是解释了scrollRectToVisible()的工作原理。

您可以通过增加“可见矩形”大小来影响滚动。例如:

Rectangle rect = table.getCellRect(rowIndex, 0, true);
rect.height = rect.height + (table.getRowHeight() * 4);
table.scrollRectToVisible(rect);

现在,当向下滚动时,所选行应该是从底部开始的4行。向上滚动时没有任何帮助,因为所选行将位于顶部。

  

我怎么可能把选中的行放到中间?

要将所选行定位在中间,您需要直接使用视口位置来计算所选行的视口中的中间位置:

JViewport viewport = (JViewport) table.getParent();
Rectangle r = table.getCellRect(rowIndex, 0, true);
int extentHeight = viewport.getExtentSize().height;
int viewHeight = viewport.getViewSize().height;

int y = Math.max(0, r.y - ((extentHeight - r.height) / 2));
y = Math.min(y, viewHeight - extentHeight);

viewport.setViewPosition(new Point(0, y));

答案 1 :(得分:0)

您可以在调用getCellRect时增加行索引。在检查了行数之后。

public void scrollToVisibleInstructionBlock(JTable table, int rowIndex, int sizeOfBlock) {
    if (!(table.getParent() instanceof JViewport))
        return;
    JViewport viewport = (JViewport) table.getParent();

    // bottom of selection is 5 rows above bottom of scrollpane
    int delta = 5;
    if ((rowIndex + (sizeOfBlock-1) + delta) >= table.getRowCount())
        delta = 0;
    else
        delta = delta + (sizeOfBlock-1);

    Rectangle rect = table.getCellRect(rowIndex+delta, 0, true);
    Point pt = viewport.getViewPosition();
    rect.setLocation(rect.x - pt.x, rect.y - pt.y);
    viewport.scrollRectToVisible(rect);
    table.setRowSelectionInterval(rowIndex, rowIndex + sizeOfBlock - 1);
}

您还应该考虑sizeOfBlock参数。如果你想让选择居中,也许还有滚动窗格的大小。

答案 2 :(得分:0)

这很容易,JTable也具有scrollRectToVisible方法。如果需要,您可以尝试类似的操作,如果添加了新记录,则使滚动窗格移至底部

O(N)

我最后一次添加记录的位置。 要滚动列,请用列索引替换getCellRect的第二个参数。