JFreeChart | Plot updaten bei neuem Dataset | wahrscheinlich "Thread-abhängig"

Garm

Mitglied
Ahoi.

Ich habe ein klitzekleines Problem mit dem Updaten eines Charts.

Folgender an einen jButton gebundener Ablauf funktioniert zwar, aber das Chart updatet nur mit dem letzten Update des Datasets.

Java:
class IntervallListener implements ActionListener
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
                    _model.startzeit = new BigDecimal(_view.jTextField1.getText());               // nimmt Eingabe aus TextField
                    _model.zielzeit = new BigDecimal(_view.jTextField2.getText());               // nimmt Eingabe aus TextF
                    _model.zeitintervall = new BigDecimal(_view.jTextField3.getText());               // nimmt Eingabe aus TextF

                    BigDecimal zielinsec = _model.zielzeit.multiply(_model.yrinsec, _model.mc);               // rechnet eingegebene Jahre in Sekunden um
                    BigDecimal startinsec = _model.startzeit.multiply(_model.yrinsec, _model.mc);               // rechnet eingegebene Jahre in Sekunden um
                    BigDecimal intervallinsec = _model.zeitintervall.multiply(_model.yrinsec, _model.mc);               // rechnet eingegebene Jahre in Sekunden um

                    BigDecimal steps = ( _model.zielzeit.subtract(_model.startzeit)).divide(_model.zeitintervall, _model.mc3);
                    int i = steps.intValue();               // berechnet Anzahl der für die Zeitdifferenz mit Intervall nötigen Schritte


                    for(int d = 1; d <= i; d++)
                    {
                        BigDecimal wieoft = new BigDecimal(d);                       
                        BigDecimal newtime = startinsec.add(intervallinsec.multiply(wieoft));     // aktuelle Zeit nach Rundenzahl*Intervall

                                for(int z=0; z<_model.planettime.length; z++)
                                {
                                    BigDecimal newplanettime = newtime.divide(_model.time[z], _model.mc);
                                    _model.planettime[z] = newplanettime.doubleValue();
                                }                 // berechnet im wesentlichen das Zeitverhältnis für die Position der Planeten
    
                                _model.berechnePLANETENPOSITION();        // berechnet aus Zeitverhältnis die Position der Planeten
                                _view.jLabel20.setText(String.valueOf(newtime.divide(_model.yrinsec, _model.mc2)));
                                _model.aktuellezeit = newtime;
                                _model.aktuellezeitinyr = newtime.divide(_model.yrinsec, _model.mc2);
                                _view.jTextField1.setText(String.valueOf(_model.aktuellezeitinyr));    //gibt berechnete Zeitwerte in GUI aus
                                
                                _chart.createDataset2();               // erstellt Dataset aus neuen Werten
                                _chart.plot2.setDataset(2, _chart.datasetPLANETENPOSITION);   // setzt neues Dataset und löst damit Aktualisierung des Charts aus
                                
                                        try { Thread.sleep(500); } 
                                        catch (InterruptedException ex) { }   // hier liegt wohl das problem

                                        System.out.println(
                                        "Positionen "+d
                                        +"\n"+
                                        "px1 "+_model.px1
                                        +"  "+
                                        "py1 "+_model.py1
                                        +"\n"
                                        ); 

                    }
                }
        }

Es geht darum, dass eine Start- und Zielzeit und ein Intervall gesetzt wird. Daraus wird die Anzahl der nötigen Schritte "steps" berechnet, die dann einzeln im Chart angezeigt werden sollen.
Sinngemäß soll das Chart alle 500ms aktualisiert werden, nachdem die Schleifen die entsprechenden Werte berechnen und in das Dataset einfügen.

Die Aktualisierung klappt auch, das println gibt passende Werte im passenden Zeitintervall aus. Leider aktualisiert das Chart nur einmal. Die letzte Berechnung und Ausgabe (println) fallen mit der Aktualisierung des Charts zusammen.

Eigentlich soll es so laufen, dass die innere for-Schleife durchläuft und das Chart aktualisiert wird, dann wird 500ms gewartet und die äußere for-Schleife macht den nächsten Durchlauf.


Hat jemand eine Idee, warum das nicht klappt?
Ich vermute mittlerweile, dass ich einen neuen Thread starten muss, der dann pausiert wird....aber ich hab, ehrlich gesagt, keinen Plan ;)

cya und danke
Garm
 
Zuletzt bearbeitet:

Garm

Mitglied
Ahoi.

Danke sehr :)

Habe mir das Tutorial http://www.java-forum.org/blogs/turtle/165-swingworker-einfuehrung.html#_ reingezogen, wie es so schön heißt.
Und siehe da, es funktioniert :D

Um es mal komplett zu machen:
Java:
class IntervallListener implements ActionListener
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
               SwingWorker<Void, Void> worker;
               _view.jButton1.setEnabled(false);
               worker = new SwingWorker<Void, Void>() 
               {
                   @Override
                   protected Void doInBackground() throws Exception
                    {
                       bewegePLANETEN();
                       return null;
                    }
                    @Override
                    protected void done() 
                    {
                        _view.jButton1.setEnabled(true);
                    }
               };
               worker.execute();
        }
   }
Ich habe die Methode aus dem ersten Beitrag in die bewegePLANETEN() ausgelagert und sie dann über den SwingWorker aufgerufen.

Ist das so in Ordnung oder funktioniert und nur, weil grade in diesem Fall keine Fehler auftauchen?

cya und danke
garm
 
S

SlaterB

Gast
grundsätzlich ist das so eine Besserung, wobei setEnabled() nicht unbedingt die Sicherheit von done() braucht
(gerade nicht nebenläufig/ Hintergrund, sondern wieder vom AWT-Thread ausgeführt),
ergo alles eigentlich nur ein Thread ist, das ginge kürzer, den Sinn von SwingWorker gegenüber einfachen Thread nicht wirklich genutzt,

noch mehr ins Detail geschaut könnte es theoretisch möglicherweise noch zu Problemen kommen,
weil GUI-Änderungen nebenläufig ausgeführt werden, wenn in einem ungünstigen Neuzeichnen-Moment der GUI...

setText()-Aufrufe sind so sicher wie setEnabled(), aber das Austauschen des DataSets macht womöglich Probleme,
in die done()-Methode eines SwingWorkers ist das wegen der Schleife nicht ganz so leicht zu verschieben,
eine kleine Möglichkeit zur Sicherheit ist dann immer SwingUtilities.invokeLater(), falls du auch zu diesem Stichwort weiter so erfolgreich nachschlagen willst
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E JFreeChart (LineChart) akutalisiert nicht Java Basics - Anfänger-Themen 10
C JFreeChart Linie nicht korrekt dargestellt Java Basics - Anfänger-Themen 1
B Markieren einzelner Punkte in JFreeChart Java Basics - Anfänger-Themen 1
N JFreeChart --> TimeSeries auslesen Java Basics - Anfänger-Themen 9
N JFreeChart - Value und veriable Zeitachse Java Basics - Anfänger-Themen 15
J JFreeChart wird nicht angezeigt Java Basics - Anfänger-Themen 6
A JFreeChart als png abspeichern Java Basics - Anfänger-Themen 2
S Jfreechart mit LinkedList befüllen Java Basics - Anfänger-Themen 1
S JFreeChart - Speichermanagement Java Basics - Anfänger-Themen 6
M Problem JFreeChart Java Basics - Anfänger-Themen 8
M JFreeChart Java Basics - Anfänger-Themen 5
P JFreechart Java Basics - Anfänger-Themen 9
G JFreeChart und das Update(was nicht klappt). Java Basics - Anfänger-Themen 3
G jfreechart einbinden + tutorial Java Basics - Anfänger-Themen 2
G JFreeChart einbinden Java Basics - Anfänger-Themen 4
M JFreeChart nach erneutem aufruf fehlt 2. Achse Java Basics - Anfänger-Themen 4
N JFreeChart Koordinatenachsen Java Basics - Anfänger-Themen 11
G Problem mit der Darstellung (JFreechart) Java Basics - Anfänger-Themen 3
M jfreechart - Balkendiagramm mit Werten anzeigen, geht das? Java Basics - Anfänger-Themen 2
S JFreeChart Java Basics - Anfänger-Themen 4
L JFreeChart Java Basics - Anfänger-Themen 3
L JFreeChart in Eclipse Java Basics - Anfänger-Themen 5
S JFreeChart Java Basics - Anfänger-Themen 7
A Applet Plot für atan erstellen Java Basics - Anfänger-Themen 1
-horn- Zwischenwerte vom x,y-Plot interpolieren? Java Basics - Anfänger-Themen 5
B JaxB - Unique Name updaten / Referenzen in XML Java Basics - Anfänger-Themen 0
S Daten/Klassen/Packages richtig updaten!? Java Basics - Anfänger-Themen 2
C ProgressBar updaten Java Basics - Anfänger-Themen 4
M Jtable änderung updaten Java Basics - Anfänger-Themen 2
T OOP GUI aus anderer Klasse updaten Java Basics - Anfänger-Themen 6
E Gui updaten während langer Methode Java Basics - Anfänger-Themen 2
E JTable + TableModel updaten? Java Basics - Anfänger-Themen 1
G drawString/ JLabel updaten Java Basics - Anfänger-Themen 1
H java version updaten Java Basics - Anfänger-Themen 11
J Servertime updaten Java Basics - Anfänger-Themen 4
Screen Threads Wie thread stoppen/closen ? und wie GUI at runntime updaten? Java Basics - Anfänger-Themen 10
B Progress Bar Updaten Java Basics - Anfänger-Themen 4
S JFRAME updaten Java Basics - Anfänger-Themen 6
J arraylist ausserhalb der main Methode zugänglich machen (Elemente adden und updaten) Java Basics - Anfänger-Themen 4
G JList updaten Java Basics - Anfänger-Themen 7
T Bei Struts Beans updaten ohne ein Request zu verarbeiten Java Basics - Anfänger-Themen 4
MegaWatt Wie Applet mit Timer updaten, warum 2. Thread ? Java Basics - Anfänger-Themen 5
M JTable updaten woran liegt es bloß? Java Basics - Anfänger-Themen 2
J Dateien in JAR-Datei updaten Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben