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