gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 04:36:20 25 4
gpt4 key购买 nike

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com