JTextfield automatisch aus zweiter Klasse aktualisieren

Joschi1711

Mitglied
Hallo Leute,
eventuell kann mir hier nach ewiger Suche jemand helfen.
Ich habe hier zwei Klassen, einmal Oberflaeche.java zum ander rechnen.java.
Oberflaeche sagt der Name schon enthält Textfelder und Buttons, rechnen liest dann eine .csv aus, berechnet einige Daten und schreibt diese dann in eine MySQL-Tabelle.
nun habe ich einen Zeilenzähler in rechnen.java und möchte den Wert an ein Textfeld der Oberfläche übergeben, diese soll sich logischerweise beim Hochzählen ständig aktualisieren.
hat da jemand eine Idee?
hier mal der Teil der Oberfläche mit dem Textfeld
Java:
zaehler = new JTextField();
        zaehler.setBounds(283, 334, 86, 20);
        panel.add(zaehler);
        zaehler.setColumns(10);

und hier die Zählschleife:
Java:
while((row = csvReader.readNext()) != null) {            // Schleife lesen bis letzte Zeile der CSV
            String vke = row[11];
            String ek = row[12];
             ........ berechnungen habe ich rausgeschnitten........
        artzahl++;
        Artzahl = String.valueOf( artzahl);

sprich ich möchte die Artzahl aktuell im Textfeld anzeigen.
 
die while-Schleife läuft in der rechnen.java und wird aus der Oberflaeche mit :
Java:
JButton btnInDbEintragen = new JButton("In SAGE  eintragen");
        btnInDbEintragen.setBounds(100, 333, 166, 23);
        btnInDbEintragen.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e1){

                try {
                    rechnen.berechnen();
                } catch (Exception e2) {
                    e2.printStackTrace();
                }

            }
        });
aufgerufen
 
Dann läuft beides in demselben Thread. Swing wird die Anzeige erst aktualisieren, sobald die actionPerformed-Methode abgeschlossen ist, also erst nach Abschluss der Berechnungen. Du solltest den Aufruf rechnen.berechnen(); in einen eigenen Thread auslagern. Dann müsste sich die Anzeige auch während der Berechnung aktualisieren.
 
Ok danke dir, ich hoffe es ordentlich geschrieben zu haben, es funktioniert ^^:
Java:
JButton btnInDbEintragen = new JButton("In SAGE  eintragen");
        btnInDbEintragen.setBounds(100, 333, 166, 23);
        btnInDbEintragen.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e1){

                new Thread() {
                    public void run(){
                        try {
                            rechnen.berechnen();
                        } catch (Exception e2) {
                            e2.printStackTrace();
                        }
                    }
                }.start();
               
               

            }
        });
       
       
        panel.add(btnInDbEintragen);
 
Benutze nicht Thread, da du sonst bei komplexeren Berechnungen trotzdem das Neuzeichnen blockierst.
Swing ist nicht Thread-Safe und ein wirklich sehr sehr altes Framework.

Schaue dir mal das hier an...
Code:
SwingUtilities.invokeLater(new Runnable() {...}

...hier gibt es auch kleinere Infos dazu.

viele Grüße
Steven
 

Zurück
Oben