SwingWorker aufrufen (von einer anderen Klasse)

hi,
Java Code:

[ol]
[li]public class LangDauerndeAufgaben {[/li][li] static int c = 0;[/li][li] public static class aufgabe1 extends SwingWorker<Void, String> {[/li][li] @Override[/li][li] protected Void doInBackground() {[/li][li] //Aufgabe 1 bis zur Haelfte machen[/li][li] publish(new String(“Haelfte fertig”));[/li][li] // Aufg1 fertig machen[/li][li] publish(new String(“fertig”));[/li][li] return null;[/li][li] }[/li][li] @Override[/li][li] protected void process(List statusString) {[/li][li] //statusTextArea gehört anderer Klasse NewJFrame falls das geht[/li][li] NewJFrame.statusTextArea.append(statusString.get©);[/li][li] c++;[/li][li] }[/li][li] }[/li][li]}[/li][/ol]

versuche gerade swingworker zu lernen damit die gui nicht immer einfriert, könnte man vielleicht aufgabe1 in einer anderen Klasse ausführen, z.B. in NewJFrame oder so? müsste doch eigentlich irgendwie mit execute gehen, aber bekomme das nicht hin

new LangDauerndeAufgaben.aufgabe1().execute() funktioniert schon, aber das mit dem c nicht. In process() alle Elemente der Liste abarbeiten, weil nicht vorherzusagen ist, wie viele Elemente in der Liste sind. Zwei publish-Aufrufe können zu zwei process-Aufrufen mit jeweils einem Element in der Liste führen, können aber auch zu einem Aufruf mit zwei Elementen in der Liste führen.

klappt! nur komischerweise sobald man in doInBackground() ein BufferedImage erstellt, wird nicht mehr gearbeitet, also die zwei publish aufrufe scheinen dann plötzlich nicht mehr zu klappen. z.B.

BufferedImage bi = ImageIO.read(new File(„image.jpg“);

Es gibt eigentlich keinen Grund warum es nicht funktionieren sollte. Beispiel Code? Idealerweise kompilier- und ausführbar.

new String ist hier unnötig, erzeugt eine Kopie von „Haelfte fertig“ es reicht einfach publish("Haelfte fertig");

okay schonmal danke. also schreibt man nur in doInBackground():

File f = new File(„image.jpg“);
BufferedImage bi;

scheinen die publish noch zu klappen, also Haelfte fertig und fertig wird ausgegeben, schreibt man zusätzlich noch

@Override
protected void done(){
NewJFrame.statusTextArea.append(„Fertig mit worker!“);
}

dann klappt das auch. Aber sobald in doInBackground() diese zeile ergänzt wird, ist der worker anscheinend sofort fertig, macht gar kein publish mehr sondern nur noch „Fertig mit worker“.

bi = ImageIO.read(f);

Ruf in done(), get() auf und schau ob eine Exception fliegt.

o tatsächlich

java.util.concurrent.ExecutionException: javax.imageio.IIOException: Can’t read input file!

  • 1000 weitere fehlerzeilen. hmmm

wie kommt das?

wo sind die klugen köpfe? müsste man vielleicht die images irgendwie als classpath variable oder sonstwas im Projekt bekanntmachen? Fehler lässt sich nich beheben… vllt ganz einfach aber noch nich geschafft :frowning:

Vermutlich passt der Pfad nicht. Lass ihn Dir doch mal ausgeben und schau Dir auch die Varianten unter dem Punkt ImageIO an: Grafikdateien laden und anzeigen

public class Test
{

    public static void main(String[] args)
    {
        File f = new File("image.jpg");
        System.out.println(f.exists());
        System.out.println(f.getAbsolutePath());
    }

}

schau dir an wohin dein Pfad aktuell führt und passe ihn so, dass er stimmt,

Class.getResource/AsStream ist noch ein anderer Ladeweg