2016-12-26 4 views
1

Ich verwende eine JTable, um Daten anzuzeigen. Wenn eine Zeile programmgesteuert ausgewählt wird, sollte (automatisch) diese Zeile in die Ansicht verschoben werden, sodass sie die erste Zeile oben ist. Dafür habe ich die folgende Methode:Scrollen Sie zur ausgewählten Zeile für JTable

Das Problem ist, dass das Aufrufen dieses möglicherweise scrollt oder nicht, z. Die ausgewählte Zeile kann oben oder nicht in einer nicht-deterministischen Weise sein. Um dies zu beheben, habe ich versucht, die Methode zweimal mit einer Verzögerung in-between sowie Neulackierung nannte es:

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(); 
} 

Dies viel besser funktioniert, aber nach wie vor Pannen manchmal die Tabellenspalten aus, da es offenbar nicht klug ist um die EDT anzuhalten, während es aktualisiert wird. Der Aufruf repaint() scheint zu verhindern, dass sich die Zeilen auf ähnliche Weise "überlappen". Die Grafikfehler lassen sich zwar leicht beheben, indem Sie die Maus über die betroffenen Zeilen/Spalten bewegen, aber das sollte nicht passieren.

Wie kann ich das Scrollen ohne Warten und ohne grafische Störungen elegant durchführen?

Antwort

2

Code sieht vernünftig aus. Normalerweise besteht der Trick darin, sicherzustellen, dass die Breite/Höhe des Rechtecks ​​der Größe des Ansichtsfensters entspricht, um den Bildlauf zu erzwingen.

Zwei Gedanken.

  1. Entfernen Sie die Thread.sleep(). Das einzige, was dazu führt, ist, dass sich die GUI nicht für 100ms neu streichen lässt.

  2. Versuchen Sie, die scrollRectToVisible(...) in einer SwingUtlities.invokeLater(...) zu wickeln.

Wenn Punkt 2 dann nicht helfen Posten proper [MCVE], der das Problem demonstriert.

+0

Tat Ihr zweiter Vorschlag der Trick: 'SwingUtilities.invokeLater (() -> table.scrollRectToVisible (new Rectangle (cellRectangle.x, cellRectangle.y, (int) visibleRectangle.getWidth(), (int) visibleRectangle .getHeight()))); ' – BullyWiiPlaza

Verwandte Themen