2016-12-26 3 views
1

私は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

コードは合理的です。通常、トリックは、Rectangleの幅/高さが、スクロールを強制するためのビューポートのサイズであることを確認することです。

2つの考え。

  1. )(のThread.sleepを取り除きます。 GUIが100ms間再描画されないようにするだけです。

  2. scrollRectToVisible(...)SwingUtlities.invokeLater(...)にラッピングしてみてください。

ポイント2が問題を示す正しい[mcve]を投稿できない場合は、

+0

確かに、2番目の提案は、トリックでした: 'SwingUtilities.invokeLater(() - > table.scrollRectToVisible(newRectangle.x、cellRectangle.y、(int))visibleRectangle.getWidth()、(int)visibleRectangle .getHeight()))))); ' – BullyWiiPlaza

関連する問題