私はJTable
を使ってデータを表示しています。プログラムで行が選択されると、行が上にある最初の行になるように、その行を(自動的に)スクロールして表示する必要があります。このために私は次のメソッドを持っています:JTableの選択された行へ正しくスクロール
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()
コールは、行が同様の方法で「オーバーラップ」しないように見えます。グラフィカルなグリッチは、影響を受けた行/列にマウスを移動することで簡単に修正できますが、発生しないようにしてください。
グラフィカルなグリッチを待たずにスクロールを正常に実行するにはどうすればよいですか?
確かに、2番目の提案は、トリックでした: 'SwingUtilities.invokeLater(() - > table.scrollRectToVisible(newRectangle.x、cellRectangle.y、(int))visibleRectangle.getWidth()、(int)visibleRectangle .getHeight()))))); ' – BullyWiiPlaza