Scrolling-Problem bei Fokuswechsel JScrollPane / JButton

shocking

Mitglied
Hi Leute,

ich habe da folgendes Problem:

Ich habe eine JScrollPane deren View ein JPanel ist. Dieses JPanel enthält wiederum mehrere JPanel, die wiederum mehrere JTextFields enthalten, so dass der Inhalt größer ist als der sichtbare Bereich der View. Unterhalb der JScrollPane befinden sich ein paar JButtons, die verschiedene Action ausführen.
Wenn ich nun den Fokus in einem der Textfields habe und dann auf einen der Buttons klicke, soll nach Ausführen der Action der Fokus wieder im vorher fokussierten Textfeld sein.
Um ein automatisches Scrollen auszuführen habe ich einen ScrollFocusAdapter geschrieben und auf den Textfields platziert:

Code:
public void focusGained(FocusEvent e) {

        Component focusedComponent = e.getComponent();

        if (!focusedComponent.equals(MainFrame.getInstance().getLastFocusedComponent())) {

            // selektiere den Text
            if (focusedComponent instanceof JTextComponent) {
                ((JTextComponent) focusedComponent).selectAll();
            }

            bounds = focusedComponent.getBounds(null);

            JPanel parent = getParentPanel(focusedComponent);
            // X soll beim scrollen vernachlaessigt werden. Wir scrollen nur
            // vertikal.
            bounds.x = 0;

            parent.scrollRectToVisible(bounds);
            parent.repaint();
}

Mein Problem ist, dass wenn das Textfeld z.B. mittig auf dem JPanel platziert ist und ich dann die Action (die in einen eigenen Thread ausgelagert ist wg. Datenbankzugriff) auslöse, scrollt die JScrollPane automatisch ans Ende des Panels. Dann wird die Action ausgeführt und am Ende dann das Setzen des Fokus in das Textfeld wieder erledigt. Dann scrollt die JScrollPane wieder hoch zum Textfeld (durch das focusGained des ScrollAdapters). Dabei entsteht ein hässliches Flackern, weil das nicht schnell genug hintereinander ausgeführt wird.
WIe kann ich also erreichen, dass die ScrollPane still stehen bleibt beim verlieren des Fokus, und dann auch nur dann scrollt, falls das Feld wirklich außerhalb des sichtbaren Bereichs liegt?


Vielen Dank
shocking
 
Hi,

also vielleicht interessiert es jemanden, wie ich das Problem gelöst habe...
Es hat sich herausgestellt, dass das automatische herunterscrollen durch die Methode adjustVisibility im DefaultCaret der TextFields und TextAreas ausgelöst wurde. Ich habe in meinen Textkomponenten jeweils die scrollRectToVisible-Methode überschrieben, so dass diese nichts mehr macht, wenn sie aufgerufen wird. Dadurch wurde das herunterscrollen quasi ausgehebelt. Zudem habe ich meine focusGained-Methode dahingehend geändert, dass diese nur noch scrollt, wenn die bounds nicht im aktuell sichtbaren Rect der ScrollPane liegen...

Und nun klappt es auch mit dem Nachbarn und auch die einzelnen Threads sind kein Problem mehr.

Gruß shocking
 
Zurück