Threads PrograssBar update während thread

JAMarlonVA

Mitglied
Hallo zusammen,

ich habe heute meinen ersten Thread erstellt und der funktioniert auch soweit.

Code:
public class MyRunnable implements Runnable
    {
        public void run()
        {     
            cGuid0 myGuid = new cGuid0();
         
            resetCells();
     
            List<String> guids = new ArrayList<String>();     
     
            jLabel1.setText("Creating records");
         
            for(int i = 0; i < data.length-1; i++)
            {
                guids.add(myGuid.createGuid0());
                mySQL.insertQuery("INSERT INTO Words (Guid0) VALUES ('" + guids.get(i) + "')");
                                       
                jProgressBar1.setValue(Math.round(5 / data.length-1 * (i / 20)));
            }
            for(int i = 0; i < data[0].length; i++) 
            {
                String row = mySQL.getRecent(data[0][i]).get(0)[0];
             
                jLabel1.setText("Updating -" + row + "- (" + data.length + ") records");
             
                jProgressBar1.setValue(Math.round(5 + (95 / data[0].length * (i / 100/95))));
             
                for(int i2 = 0; i2 < guids.size(); i2++)
                {
                    mySQL.updateQuery("UPDATE Words SET "+ row +"=N'" + data[i2+1][i].replace("'", "''") + "' WHERE Guid0='"+ guids.get(i2) +"'");
                }
            }
        }
    }

Folgendes Problem, welches für die meisten Leser wahrscheinlich klar sein wird:
Ich versuche in einem Thread eine Komponente meines Frames zu beeinflussen.
Mir ist bewusst, dass das nicht funktioniert aber ich denke jeder weiß, was ich versuche zu machen wenn er den Code liest.

Wie kann ich eine Variable, in meinem MainFrame "überwachen", mit einem Listner o.ä., sodass ich die Prograssbar während des Prozesses updaten kann?

Komischer Weise funktioniert das Label sogar.

Freue mich über jede Antwort.

PS: Habe schon einiges dazu im Internet gefunden aber komme an dem Punkt nicht weiter. Also wäre eine Situationsbezogene Antwort sehr hilfreich.
 

Robat

Top Contributor
Ich denke das was du suchst ist ein SwingWorker. Damit können im Hintergrund "zeitfressende" Operationen bearbeitet werden und die GUI geupdatet werden.
 

JAMarlonVA

Mitglied
Kannst du mir evtl. einen Link oder Erklärung geben, wie man einen SwingWorker nutzt? Ich hab schon einige Lösungen mit ihm gesehen aber werde einfach nicht schlau draus.
 

JAMarlonVA

Mitglied
Ich habe versucht dein Beispiel leicht abgeändert umzusetzen. Allerdings ohne Erfolg.

Ich werde hier Morgen weiter machen.
Danke für deine Hilfe :)

PS: Ich war leider eine Minute zu spät mit der Änderung meines BB-Codes zu"Code=Java" wäre super, wenn das jmd mit den nötigen Rechten noch übernehmen könnte.
 

JAMarlonVA

Mitglied
Habe es mir nochmal angeschaut aber ich versteh wirklich überhaupt nicht in welcher Reihenfolge hier die Methoden wie aufgerufen werden.

Hast du zufällig ein wirklich simples Beispiel, an dem ich erkennen kann wie die Methoden aufgerufen werden?
 

JAMarlonVA

Mitglied
Noch eine Sache die ich nicht verstehe, ist wie ich meiner doInBackground irgendwelche Informationen mitgeben kann. Wenn hier der Aufwändige Teil geschehen soll, wie soll ich dann ohne Zugriff auf meine abgespeicherten Informationen irgendetwas mit ihnen machen in dieser Methode?
 

Robat

Top Contributor
Das hier sollte eigentlich verdeutlichen, wann welche Methode aufgerufen wird
Java:
public class Example {

    public static void main(String[] args) {
        new Example();
    }

    public Example() {
        buildAndShowUI();
    }

    private void buildAndShowUI() {
        JFrame frame = new JFrame();
        frame.setSize(500,500);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JTextArea statusArea = new JTextArea();
        frame.add(new JScrollPane(statusArea));

        frame.setVisible(true);

        SimpleTask task = new SimpleTask(statusArea);
        task.execute();
    }

    class SimpleTask extends SwingWorker<Void, Integer> {
        private JTextArea area;
        public SimpleTask(JTextArea area) {
            this.area = area;
        }
        @Override
        protected Void doInBackground() throws Exception {
            area.append("[BACKGROUND]   in doInBackground() ... \n\n");

            for (int i = 0; i < 10; i++) {
                Thread.sleep(350);
                area.append("[BACKGROUND]   Working with " + i + "\n");
                publish(i);
            }
            return null;
        }

        @Override
        protected void process(List<Integer> chunks) {
            int lastValue = chunks.get(chunks.size() - 1);
            area.append("[PROCESS]   Publishing " + lastValue + "\n\n");
        }

        @Override
        protected void done() {
            try {
                get();
                area.append("[DONE] Done...\n");
            } catch (InterruptedException | ExecutionException e) {
                e.printStackTrace();
            }
        }
    }
}

Dem Task kannst du "Informationen" über den Konstruktor mitgeben. Hier wird bspw nur die JTextArea mitgegeben, auf die die Informationen geschrieben werden sollen. Du kannst aber natürlich auch eine Liste von Dateien, Zahlen oder irgendwelche anderen Daten im Konstruktor übergeben und diese in den Methoden verwenden.
 

JAMarlonVA

Mitglied
Müsste ich mich in der background Methode neu mit meiner DB verbinden oder kann ich eine bestehende con verwenden?

Was kannst du mir da empfehlen?
 

JAMarlonVA

Mitglied
Ich bin soweit zufrieden mit der Funktion.

Optimal wäre gewesen, wenn das Label auch wie die ProgressBar gehandhabt worden wäre und ich eine neue Verbindung zur Datenbank erstellt hätte. Jedoch funktioniert es auch so und macht das was ich will.

Danke Robat für die Unterstützung :)

Java:
   class importTask extends SwingWorker<Void, Integer>
    {   
        private JProgressBar bar;
        private JLabel label;
        private String[][] data;
     
        public importTask(JProgressBar bar, JLabel label, String[][] myCSV) {
            this.bar = bar;
            this.label = label;
            this.data =myCSV;
        }
     
        @Override
        protected Void doInBackground() throws Exception
        {
            cGuid0 myGuid = new cGuid0();
     
            List<String> guids = new ArrayList<String>();     
         
            label.setText("Creating " + String.valueOf(this.data.length-1 + " records"));
         
            for(int i = 0; i < this.data.length-1; i++)
            {
                guids.add(myGuid.createGuid0());
                mySQL.insertQuery("INSERT INTO Words (Guid0) VALUES ('" + guids.get(i) + "')");
                                       
                publish(Math.round(i * 100 / data.length));
            }
         
            publish(0);
         
            for(int i = 0; i < this.data[0].length; i++) 
            {
                String row = mySQL.getRecent(this.data[0][i]).get(0)[0];
             
                label.setText("Adding cotents --> " + row);
             
                for(int i2 = 0; i2 < guids.size(); i2++)
                {
                    mySQL.updateQuery("UPDATE Words SET "+ row +"=N'" + this.data[i2+1][i].replace("'", "''") + "' WHERE Guid0='"+ guids.get(i2) +"'");
                }
             
                publish(i * 100 / data[0].length);
            }         
            return null;
        }

        @Override
        protected void process(List<Integer> chunks) {
            int lastValue = chunks.get(chunks.size() - 1);
            bar.setValue(lastValue);
        }

        @Override
        protected void done() {
            try {
                get();
                label.setText("finished");
            } catch (InterruptedException | ExecutionException e) {
                e.printStackTrace();
            }
        }
    }
 

Robat

Top Contributor
Optimal wäre gewesen, wenn das Label auch wie die ProgressBar gehandhabt worden wäre
Das versteh ich nicht ganz. Was meinst du damit?
und ich eine neue Verbindung zur Datenbank erstellt hätte.
Könntest du ja im Konstruktor machen, wenn du wölltest.

BTW:
- Gewöhn dir am Besten an, Klassennamen immer in UpperCammelCase zu schreiben, das ist beim lesen nicht so verwirrend ;)
- SQL-Queries solltest du nicht mit String-Konkatenation zusammen bauen (Sitchwort: SQL-Injection) - schau dir lieber mal PreparedStatements an :)
 

JAMarlonVA

Mitglied
Das versteh ich nicht ganz. Was meinst du damit?

In meiner "doInBackground" Methode setze ich den Lable - Text.
Die Value von der PGB setze ich über den "publish" - Befehl in der "Process" - Methode.
Optimal wäre es doch gewesen wenn ich den Wert der in dem Label stehen soll auch über den "publish" - Befehl an die "process" - Methode übergeben hätte oder irre ich mich da?

Guter Tipp. Ich habe aber auch schon festgestellt, dass meine Klasse für die SQL Abfragen etwas misslungen ist. Aber es sind auch meine ersten Abfragen mit Java.
 

Robat

Top Contributor
Ach so. Ja aber auch das würde gehen. Du musst dir einfach eine eigene Wrapper-Klasse schreiben die Prozentzahl + Text in ein Objekt mapped.
Java:
class ResultChunk {
    private int percentage;
    private String info;

    public ResultChunk(int percentage, String info) {
        this.percentage = percentage;
        this.info = info;
    }
}
Dann kannst du beim SwingWorker eben Instanzen von ResultChunk übergeben, anstatt nur Zahlen
Java:
class Task extends SwingWorker<Void, ResultChunk> {
   @Override
    protected Void doInBackground() {
        ... 
        publish(new ResultChunk(0, "Initial Statement");
        ...
        return null;
    }
 
    @Override
    protected void process(List<ResultChunk> chunks) {
        ResultChunk lastValue = chunks.get(chunks.size() - 1);
        lbl.setText(lastValue.info);
        progressbar.(lastValue.percentage);
    }
   ...
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Mugetsu35 ArrayList Update ohne Index Java Basics - Anfänger-Themen 6
E Mysql Update wenn es nicht existiert insert Java Basics - Anfänger-Themen 14
G Konstruktor und update Java Basics - Anfänger-Themen 4
Henri Webservice Delete und Update Methode funktioniert nicht Java Basics - Anfänger-Themen 27
S Lost-Update Semaphore Java Basics - Anfänger-Themen 6
K Schlüsselworte Nach Java update findet mdb Datei nicht Java Basics - Anfänger-Themen 6
M Methodenaufruf über SQL UPDATE Java Basics - Anfänger-Themen 8
J JavaFX -> SocketIO -> Thread -> Update Label Java Basics - Anfänger-Themen 13
C JTable update mit MySQL Datenbank Java Basics - Anfänger-Themen 1
J fehler nach windows update Java Basics - Anfänger-Themen 44
Y Observer update Java Basics - Anfänger-Themen 3
G Threads Konstantes Update Java Basics - Anfänger-Themen 1
X Eventservice Probleme nach Update Java Basics - Anfänger-Themen 0
B VAriables update in for-Schelifen Java Basics - Anfänger-Themen 3
L Jar aus Jar Starten lassen (Update Tool) Java Basics - Anfänger-Themen 6
P Update System Java Basics - Anfänger-Themen 16
R Nach Ubuntu-Update: Konsole spuckt bei neu Kompilierten Programmen Fehler aus (BlueJ)(Ubuntu12.04) Java Basics - Anfänger-Themen 11
L Auf herunterfahren des PCs reagieren und Datensatz update machen Java Basics - Anfänger-Themen 15
K Threads jProgressBar update Java Basics - Anfänger-Themen 14
Gugelhupf JDK installieren Fehlermeldung 1336 - Java SDK 7 Update 5 x64 Java Basics - Anfänger-Themen 4
A JDK installieren Java update - neu installieren? Java Basics - Anfänger-Themen 7
R JDK installieren Nach Update auf java 1.7 Connection refused Java Basics - Anfänger-Themen 9
E Programm - Update via Internet? Java Basics - Anfänger-Themen 5
B JDK installieren Java SE Development Kit 6 Update 25 Java Basics - Anfänger-Themen 5
M Update-Ticker... String in Textdatei schreiben und auslesen Java Basics - Anfänger-Themen 5
S MVC Prinzip - update() ? Java Basics - Anfänger-Themen 2
B Problem mit prepareStatement UPDATE Java Basics - Anfänger-Themen 2
M Serializable - Bei Update ältere Daten importieren Java Basics - Anfänger-Themen 14
C JAVA - Einstieg mit Eclipse - Update Sites und Ähnliches Java Basics - Anfänger-Themen 6
S JTree, Problem mit View Update Java Basics - Anfänger-Themen 2
L Java Persistence API - Update Befehl? Java Basics - Anfänger-Themen 5
hdi Fehler beim Model-Update einer JList (DefaultListModel) Java Basics - Anfänger-Themen 3
A update/draw schleife Java Basics - Anfänger-Themen 5
S update wird nicht aufgerufen Java Basics - Anfänger-Themen 9
G JFreeChart und das Update(was nicht klappt). Java Basics - Anfänger-Themen 3
A label update Java Basics - Anfänger-Themen 10
Y JDK 6 Update 5 with Java EE? Java Basics - Anfänger-Themen 2
M Java SQL-Update Java Basics - Anfänger-Themen 6
A per "update" ein Bild Strich für Strich "male Java Basics - Anfänger-Themen 9
S Ein Update System programmieren Java Basics - Anfänger-Themen 27
P Zeichenprogramm-->update() aushebeln Java Basics - Anfänger-Themen 11
S SQL UPDATE in Java "wie schreiben"? Java Basics - Anfänger-Themen 6
E Update JList Java Basics - Anfänger-Themen 13
J Problem bei Update auf Datenbank Java Basics - Anfänger-Themen 2
K Observer Observable update() . Java Basics - Anfänger-Themen 13
R JRE 1.5.0 Update 7 Install erkennt nicht Firefox/Netscape Java Basics - Anfänger-Themen 3
M [SOLVED]update() bei MVC Java Basics - Anfänger-Themen 4
M Datenbankabfrage mit UPDATE Java Basics - Anfänger-Themen 4
M Unterschied zwischen J2SE 5.0 Update x und J2SE 1.4.x Java Basics - Anfänger-Themen 4
N Array aus JCheckBox? 1000 if's UPDATE: Spaltennamen auslesen Java Basics - Anfänger-Themen 12
G Update auf Datenbankspalte vom Typ Timestamp mit aktu. Datum Java Basics - Anfänger-Themen 3
G Observable/Observer update wird nicht ausgeführt Java Basics - Anfänger-Themen 9
schemil053 Multithread - Input verrutscht während etwas ausgegeben wird Java Basics - Anfänger-Themen 6
DorFey Schrittweises abändern des GUI während for-Schleife / pausieren einer for-Schleife Java Basics - Anfänger-Themen 3
A Haben KNNs ein Gedächtnis, lernen etwas oder verändern sich, während sie nicht trainieren, aber aktiv sind? Java Basics - Anfänger-Themen 3
S NullPointerException während ResultSet Java Basics - Anfänger-Themen 7
CptK Klassen mouseClicked wird nicht aufgerufen, während man die Maus bewegt Java Basics - Anfänger-Themen 4
U Ausgabe von Dateiinhalt während Programmnutzung fehlerhaft Java Basics - Anfänger-Themen 3
C Instanz einer Klasse während if-Abfrage erzeugen und bei zweiter if-Abfrage wiederverwenden Java Basics - Anfänger-Themen 6
R Einfaches refresh während runtime Java Basics - Anfänger-Themen 4
W Klassen [GELÖST] Objekte während der Laufzeit mit neuen veränderten Werten beliebig oft initialisieren Java Basics - Anfänger-Themen 2
E Gui updaten während langer Methode Java Basics - Anfänger-Themen 2
O JList aktualisieren während Dateieinlesung Java Basics - Anfänger-Themen 4
C Datei speichern während sie geöffnet ist Java Basics - Anfänger-Themen 4
llabusch Interface Layout eines Labels während der Laufzeit ändern Java Basics - Anfänger-Themen 0
R Variablen Datentyp erst während Laufzeit festlegen Java Basics - Anfänger-Themen 6
O Starte Timer, während anderer Timer noch läuft. Ruft dies Schwierigkeiten hervor? Java Basics - Anfänger-Themen 0
M Löschen von Objekten während Iteration über Liste Java Basics - Anfänger-Themen 9
J Ladebalken anzeigen während Bilder geladen werden Java Basics - Anfänger-Themen 2
C repaint wird nicht während Druck auf Maustaste ausgeführt. Java Basics - Anfänger-Themen 4
E Input/Output Inputstream während der Laufzeit füllen Java Basics - Anfänger-Themen 2
B Threads Interrupt während Socket.read()? Java Basics - Anfänger-Themen 3
M Während event einen anderen event ausführen?? Java Basics - Anfänger-Themen 3
C Referenz einer bereits instanziierten Klasse während des Programmablaufs Java Basics - Anfänger-Themen 16
B Klassen Objekte während der Laufzeit dynamisch anlegen Java Basics - Anfänger-Themen 8
Nic.o Panel während Ladevorgang einblenden Java Basics - Anfänger-Themen 12
alderwaran objekthierarchie darstellen während der laufzeit Java Basics - Anfänger-Themen 2
M Timer: period während Verlauf wechseln Java Basics - Anfänger-Themen 12
M args[] während des Programmlaufes eingeben Java Basics - Anfänger-Themen 5
A Exception Verständnisfrage: Exceptions während, einer Statischenzuweisung abfangen Java Basics - Anfänger-Themen 10
B Collection während Iteration verändern Java Basics - Anfänger-Themen 7
B Während Schleife nicht auf Eingabe warten Java Basics - Anfänger-Themen 2
G JProgressBar während dem ausführen einer Funktion Java Basics - Anfänger-Themen 3
A Objekte während der Laufzeit erstellen Java Basics - Anfänger-Themen 3
C Textgröße während des Programmlaufes anpassen Java Basics - Anfänger-Themen 6
S JDialog während automatischer Dateisuche einblenden Java Basics - Anfänger-Themen 6
A Text einer JComboBox während der Laufzeit ändern ? Java Basics - Anfänger-Themen 4
S Boolean während while-schleife verändern? Java Basics - Anfänger-Themen 6
M Java Heap Space während der Laufzeit ändern Java Basics - Anfänger-Themen 2
M Problem beim ändern von Komponenten während Visible(true) Java Basics - Anfänger-Themen 4
G String im TextPane während der Eingabe überprüfen? Java Basics - Anfänger-Themen 12
A Code während des laufenden Programms eingeben Java Basics - Anfänger-Themen 7
P Javaquellcode während der Laufzeit einbinden Java Basics - Anfänger-Themen 18

Ähnliche Java Themen

Neue Themen


Oben