java - 正确滚动到 JTable 的选定行

标签 java swing jtable

我正在使用 JTable显示数据。当以编程方式选择一行时,它应该(自动)将该行滚动到 View 中,使其成为最上面的第一行。为此,我有以下方法:

private static void scrollToSelectedRow(JTable table)
{
    JViewport viewport = (JViewport) table.getParent();
    Rectangle cellRectangle = table.getCellRect(table.getSelectedRow(), 0, true);
    Rectangle visibleRectangle = viewport.getVisibleRect();
    table.scrollRectToVisible(new Rectangle(cellRectangle.x, cellRectangle.y, (int) visibleRectangle.getWidth(), (int) visibleRectangle.getHeight()));
}

问题是调用它可能会或可能不会正确滚动,例如所选行可能以不确定的方式位于顶部或不位于顶部。为了解决这个问题,我尝试调用该方法两次,中间有延迟并重新绘制它:

public static void setSelectedRow(JTable table, int rowIndex, int columnIndex)
{
    table.setRowSelectionInterval(rowIndex, columnIndex);
    scrollToSelectedRow(table);
    try
    {
        Thread.sleep(100);
    } catch (InterruptedException exception)
    {
        exception.printStackTrace();
    }
    scrollToSelectedRow(table);
    table.repaint();
}

这工作得好多了,但有时仍然会导致表格列出现故障,因为显然停止 EDT 并不明智。在更新的时候。 repaint() 调用似乎以类似的方式防止行“重叠”。将鼠标移到受影响的行/列上可以轻松修复图形故障,但这不应该发生。

如何在不等待且不出现图形故障的情况下优雅地执行滚动?

最佳答案

代码看起来很合理。通常,诀窍是确保矩形宽度/高度是强制滚动的视口(viewport)大小。

两个想法。

  1. 去掉 Thread.sleep()。所做的只是防止 GUI 在 100 毫秒内重新绘制自身。

  2. 尝试将 scrollRectToVisible(...) 包装在 SwingUtlities.invokeLater(...) 中。

如果第 2 点没有帮助,则发布一个适当的 [mcve] 来演示问题。

关于java - 正确滚动到 JTable 的选定行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41333137/

相关文章:

java - 边框布局循环。 J面板/Swing

java - jTable paint() 导致 java.lang.OutOfMemoryError : Java heap space

java - 在另一个窗口中使用现有的 Java 框架表单

java - 在 Java 小程序中显示 FTP 文件上传过程中的进度

Java 框架显示我的屏幕

jquery - jtable "Add new record"css 不显示

java - JTable 未在 ActionEvent 中显示

日期范围的 Java 掩码格式

java - karaf- assembly 4.0.5 - 成功的 Maven 构建结束时不会生成 zip ard tar.gz 文件

java - 为什么Java中的数组索引从0开始?