ein jlabel als statusanzeige

a.pst

Aktives Mitglied
slave

ich möchte dasein jlabel den vortschritt in einem thread anzeigt, und oh wunder, es will mir nicht glücken 🙁

der timer läuft brav sekunde für sekunde bis er nicht mehr gebraucht wird...

(multi ist eine membervariable, sec und sekunden eben so, zeit ist das betreffende label)
Java:
@Action
    public void montecarlo() {
        nachricht.setText(ls);
        getIndex();
        timer = new Timer();
        Thread start = new Thread(new MonteStart());
        start.start();
        timer.schedule(new Zeigezeit(), 1000, 1000);
        try {
            start.join();
        } catch (InterruptedException ex) {
            Logger.getLogger(Futterberechnung4View.class.getName()).log(Level.SEVERE, null, ex);
        }
        timer.cancel();
        setFeld();
        if (indikator == true) {
            if (false == prüftNullerArray(multi)) {
                nachricht.setText(ls);
                eingabe();
            } else {
                nachricht.setText("monte carlo is fertig & kein ergebnis gefunden!");
                eingabe();
            }
        }
    }

    class MonteStart implements Runnable {

        public void run() {
            multi = Zentrale.montecarlo();
        }
    }

    class Zeigezeit extends TimerTask {

        int i = 0;

        public void run() {
            //    System.out.println("timer arbeitet");
            sec = Integer.valueOf(i).toString();
            new SetzeZeitLabel().execute();
            i++;
        }
    }

    class SetzeZeitLabel extends SwingWorker<String, String> {

        @Override
        public String doInBackground() {
//gibt brav und pünktlich den String sec aus
            System.out.println(sec);
            return sec + sekunden;
        }

        @Override
        protected void done() {
            try {
//es wird nur die letzte sekunde ausgegeben, die zeit spanne um welche es geht, wird aber nicht angezeigt
                zeit.setText(get());
            } catch (Exception ignore) {
            }
        }
    }
wie bringe ich das elende jlabel dazu sich zu andern während der thread läuft?

entnervte grüße^^
 
wow, da ist ja mal alles durcheinander gemischt,
ein Thread wird gestartet, ein Timer spielt mit, SwingWorker auch noch dabei,

in der Masse querbeet durcheinander praktisch noch nie gesehen, bemerkenswert,


eine üble Schleife auch gleich eingebaut, soweit ich das sehe,
die montecarlo()-Methode startet unmittelbar einen neuen MonteStart-Thread,
welcher sofort montecarlo() aufruft

-> noch ein neuer Thread, nochmal montecarlo() usw., sollte eigentlich in Kürze
'OutOfMemoryError: unable to create new native thread'
bringen wie bei mir in verkürzten Test..

alles testen kann ich leider nicht, SwingWorker etwa für mein Java (und auch meinen Kenntnisstand) zu hoch


irgendwie musst du aber reduzieren, entweder Thread mit Pausen oder einen Timer, das sollte reichen falls du etwas periodisch machen möchtest,
wozu das join() + cancel()? wann soll warum abgebrochen werden?


> //es wird nur die letzte sekunde ausgegeben, die zeit spanne um welche es geht, wird aber nicht angezeigt

dein Hauptproblem scheint in diesem SwingWorker zu liegen, hmm,
bei doInBackground() gibst du sec aus, das ist ein String nach anderem Code,
sec + sekunden könntest du auch nochmal loggen, sollte den sec-Anteil aber zumindest nicht kaputt machen

und get() dazu liefert wirklich nicht genau diesen Wert?
prüfe das auch zusammen mit Hashcode des SetzeZeitLabel-Objektes im Logging, um nicht verschiedene Ausgaben zu vermischen oder so

falls das nicht funktioniert fällt mir dazu nix ein, aber allgemeiner Tipp wäre, dann auf dieses Feature zu verzichten und ein normales Attribut in SetzeZeitLabel zu setzen,
wenn du darin in doInBackground() einen korrekten String speicherst und in done() ausliest, wird das ja wohl funktionieren,

aber von get() sollte man sicher dasselbe sagen können..

edit:
> danke, das wars...

arg 😉
 
wow, da ist ja mal alles durcheinander gemischt,
...
dein Hauptproblem scheint in diesem SwingWorker zu liegen, hmm,
bei doInBackground() gibst du sec aus, das ist ein String nach anderem Code,
sec + sekunden könntest du auch nochmal loggen, sollte den sec-Anteil aber zumindest nicht kaputt machen
...
das problem war nicht der SwingWorker, sondern die join anweisung, denn der hat den EDT blockiert.
der swingworker hat einwandfrei funktioniert und brav hoch gezählte geschrieben.
der code sieht jetzt so aus, aber schön ist er immer noch nicht.
Java:
    @Action
    public void montecarlo() {
        nachricht.setText(ls);
        getIndex();
        if (getIndex() == true) {
            timer = new Timer();
            Thread start = new Thread(new MonteStart());
            start.start();
            timer.schedule(new Zeigezeit(), 1000, 1000);
        }
    }

    class MonteStart implements Runnable {

        public void run() {
            zeit.setVisible(true);
            auswahlPanel.setVisible(false);
            buttonPanel.setVisible(false);
            multi = Zentrale.montecarlo();
            timer.cancel();
            setFeld();
            if (false == prüftNullerArray(multi)) {
                nachricht.setText(ls);
                eingabe();
            } else {
                nachricht.setText("monte carlo is fertig & kein ergebnis gefunden!");
                eingabe();

            }
        }
    }

    class Zeigezeit extends TimerTask {

        int i = 1;
        int max = BasisContainer.maxzeit ;
        
        public void run() {
            
            sec = Integer.valueOf(i).toString() + " von max. " + 
                    Integer.valueOf(max / 1000).toString() + " sekunden";
                    zeit.setText(sec);                
            i++;
        }
    }
 
Zuletzt bearbeitet:
ich hatte

doInBackground():
//gibt brav und pünktlich den String sec aus

done():
//es wird nur die letzte sekunde ausgegeben

so verstanden als wäre der angezeigte String nur zum Teil korrekt, aber es war das andere gemeint
 
ich hatte

doInBackground():
//gibt brav und pünktlich den String sec aus

done():
//es wird nur die letzte sekunde ausgegeben

so verstanden als wäre der angezeigte String nur zum Teil korrekt, aber es war das andere gemeint
genau, es war anders gemeint...mehrdeutigkeit ist eben ein problem der natürlichensprache^^
done() konnte nicht arbeiten weil der EDT durch das join() gesperrt war. was wiederum doInBackground() nicht interessiert hat, weil eben im hintergrund 🙂
 

Zurück
Oben