Swing SwingUtils / Thread Problem

Diskutiere SwingUtils / Thread Problem im AWT, Swing, JavaFX & SWT Forum; Hallo, ich stehe leider irgendwie auf dem Schlauch. Es geht um ein Problem mit Threads bzw. SwingUtilities.invokelater()... Ich habe schon gefühlt...

  1. darkwall
    darkwall Neues Mitglied
    Hallo,
    ich stehe leider irgendwie auf dem Schlauch. Es geht um ein Problem mit Threads bzw. SwingUtilities.invokelater()... Ich habe schon gefühlt 1000 Dinge probiert, aber irgendwo hakt es noch, bin zugegebener Maßen auch kein Thread-Experte. Ich weiß schon, was das Problem ist, weiß aber leider nicht, wie und wo ich da ran gehen soll.
    Hier die genaue Beschreibung:
    Ich habe eine Klasse, die von JFrame erbt.
    In dieser wird die GUI eines Programmes zusammengebaut. Darin befindet sich u.a. ein JTable.
    Dieser soll mit Daten aus einer DB gefüllt werden. Jetzt kommt's: Es kann vorkommen, dass dies sehr viele Daten sind. Während der Ladezeit der Daten will ich eine JProgressbar anzeigen lassen, die aufpoppen soll.
    Und hier weiß ich nicht, wo und wie ich dies genau mache, denn ich habe das altbekannte Problem, dass die Progressbar "einfriert" und erst, wenn die Daten geladen und der JTable gefüllt ist, diese auf 100% springt und dann verschwindet. Der Frame, in dem der JTable drin ist, kann ruhig einfrieren, es wäre aber schön, wenn die Progressbar sich bewegt.

    Ich hoffe, ich konnte mich klar ausdrücken und ich weiß, das Problem wurde schon 1000 Mal besprochen. Leider stehe ich auf dem Schlauch und habe wohl immer an den falschen Stellen angesetzt. Ich bin für jede Hilfe sehr dankbar!

    Vielen Dank!!

    Hier nun etwas Code, bereinigt um die unwichtigen Sachen:
    Code (Text):

    public final class GUI extends javax.swing.JFrame {
       
        public GUI() {      
            initComponents(); // von Netbeans erstellte Methode, zeichnet die GUI-Elemente
            initTableFromConfig();
            formComponentShown(null);
            }

    public void initTableFromConfig() {
    // initialisiert Anfangswerte...
    }

          private void formComponentShown(java.awt.event.ComponentEvent evt) {
    // ... weiter Befehle ...
    // In dieser Methode, die aufgerufen wird, wenn der Frame angezeigt wird, rufe ich die Methode auf, die die Tabelle füllen soll:
                aktualisiereTable();
    // ... weiter Befehle ...
    }  

    public void aktualisiereTable() {
            runAkt = new Thread() {
                @Override
                public void run() {
                    updateGUI();
                }
            };
            runAkt.start();
        }

    private void updateGUI() {
            SwingUtilities.invokeLater(runAktualisiereTable);
        }

       Runnable runAktualisiereTable = new Runnable() {
            @Override
            public void run() {
     // ... weiter Befehle ...
    // Hier wird dann die Tabelle gefüllt mit Daten in einer Schleife mit folgendem Befehl:
                                meinTable.setValueAt("Beispieltext", row, col);
    // Dabei würde ich gerne eine JScrollbar hochzählen lassen.
    // ... weiter Befehle ...
             }
        };
     
     
  2. Vielleicht hilft dir diese Seite hier weiter (Klick!)
  3. mrBrown
    mrBrown Super-Moderator Mitarbeiter
    Eigentlich ganz einfach: ;)
    Das Laden muss in einem Thread getrennt von GUI-Thread stattfinden und das updaten der GUI im GUI-Thread.

    Aktuell startest du einen Thread, der nichts weiter macht, als das Laden *im* GUI-Thread zu starten.
    Du musst es also nur so umbauen, dass das Laden selbst in dem neu gestarteten Thread läuft, und nur das aktualisieren der ProgressBar in einem neuem Thread.


    SwingWorker könnte dir einen Blick wert sein ;)
     
  4. Thallius
    Thallius Bekanntes Mitglied
    Und du solltest dir mal Swingworker ansehen anstatt mit invokeLater zu arbeiten. Ist am Anfang etwas mehr zu lernen aber dafür ist es genau das was du brauchst. Da wird der Progress quasi von Haus aus geliefert.

    Gruß

    Claus
     
  5. darkwall
    darkwall Neues Mitglied
    Hi mrBrown und Claus,
    vielen Dank für eure schnellen Antworten! :)
    Ich habe es jetzt mit SwingWorker gemacht. Bin zwar noch immer nicht 100%ig glücklich, aber es läuft schon besser als zuvor!
    Vielen Dank nochmals!!
    Darkwall
     
  6. Hinweis: Du möchtest Java lernen? Vielleicht hilft dir dieser Kurs hier weiter. Sichere dir hier den Zugriff auf umfangreiches Java-Know How und starte richtig durch!
Die Seite wird geladen...

SwingUtils / Thread Problem - Ähnliche Themen

NFC Reader und JavaFx Problem -> threads?
NFC Reader und JavaFx Problem -> threads? im Forum Java Basics - Anfänger-Themen
Hilfe mit Socket Thread und ArrayList
Hilfe mit Socket Thread und ArrayList im Forum Netzwerkprogrammierung
Multithreading plattform übergreifend?
Multithreading plattform übergreifend? im Forum Allgemeine Java-Themen
Einen Thread in einer Schleife
Einen Thread in einer Schleife im Forum Allgemeine Java-Themen
PrograssBar update während thread
PrograssBar update während thread im Forum Java Basics - Anfänger-Themen
Thema: SwingUtils / Thread Problem