Wie komm ich an Rückgabewert des SwingWorkers?

Status
Nicht offen für weitere Antworten.

GilbertGrape

Bekanntes Mitglied
Hi,

ich schon wieder.

Ich poste mal erstmal den Code:

Code:
textTable.addMouseListener(new MouseAdapter() {
			public void mouseClicked(final MouseEvent e) {
				if (e.getClickCount() == 2) {
                                     //final UnmodifiedText oldText;
					final UnmodifiedText text = newTexts.get(textTable
							.getSelectedRow());
					SwingWorker sw = new SwingWorker() {
						public Object construct() {
							UnmodifiedText oldText = service
									.getTextWithSameTextId(text.getTextId(),
											text.getId());
							return oldText;
						}

						public void finished() {
						UnmodifiedText oldText = (UnmodifiedText) get();
							DlgChanges dlg = new DlgChanges(oldText.getText(), text
									.getText());
							dlg.pack();
							dlg.setVisible(true);
						}
					};
					sw.start();

					
				}
			}

Ich denke, da es sich nicht direkt um einen Fehler handelt, muss es auch nicht unbedingt ein kompilierbares BEispiel sein. (?)
Ich hab nur mal ne Frage.
Das sind ja jetzt 2 innere Klassen (ineinander). Und ich brauche die Variable oldText eigentlich außerhalb des SwingWorkers. Dafür hatte ich sie dort wo sie jetzt auskommentiert ist deklariert und wollte sie dann in finished setzen. Das geht aber nicht. Da sagt Eclipse: "The final local variable oldText cannot be assigned, since it is defined in an enclosing type" und ohne final gehts auch nicht.
So wie es jetzt ist, ist es aber glaub ich auch falsch, weil ich direkt in finished einen Dialog starte und dieser ja dann nicht mehr im EDT läuft oder?
Wie mach ich das jetzt am geschicktesten?
oldText als Member meiner Hauptklasse würde wohl gehen, aber ich brauch sie ja nur an dieser Stelle.
Vielleicht könntets ihr euch ja mal kurz anschauen!

Danke!
 
S

SlaterB

Gast
oldText muss Member in der SwingWorker-Klasse sein

Code:
public class Test
{
    public static void main(String[] args)
        throws Exception
    {
        Object sw = new Object()
            {
                String oldText = null;

                public Object construct()
                {
                    oldText = "Hi";
                    return oldText;
                }

                public void finished()
                {
                    System.out.println(oldText);
                }
            };

    }
}


edit: halt, es geht nicht um die Übertragung innerhalb des SwingWorkers, sondern wieder außerhalb der Methode?
nein, das klappt dann nicht, der SwingWorker wird ja 'irgendwo' ausgeführt und kann dann nicht die lokale Variable irgendeiner Methode ändern,

also Member in der Klasse oder in der Methode am SwingWorker abfrage (getOldText())
 

GilbertGrape

Bekanntes Mitglied
Ja gut, dann wird die Variable in finished gesetzt und woher weiß ich dann wann ich die abfragen kann?
Ich will die Variable natülich erst haben, wenn der Worker fertig ist.
Und wenn ich so direkt nach sw.start() sw.getOldText() aufrufe, läuft der Thread doch eventuell noch oder?
 
S

SlaterB

Gast
da hast du ein Problem, aber was hat das mit der Variablendeklaration zu tun?

selbst wenn es auf abenteuerliche Weise ginge, dass irgendwann die lokale Variable oldText mit einem Wert befüllt wird,
hättest du genauso das Problem, dass du nicht weißt WANN das sein wird

wenn du glaubst, dass das früh genug sein wird, bevor 'ganz am Ende der Methode' die Variable benötigt wird,
na dann kannst du ja auch erst ganz am Ende sw.getOldText() abfragen,

also ich kann gerade nicht sagen wie man mit SwingWorker korrekt arbeitet,
aber ich schätze, dass es mit der Variablendeklaration weniger zu tun hat,

wenn du übrigens im ActionListener auf den SwingWorker warten willst,
wieso dann nicht dessen Aktionen direkt im ActionListener ausführen?
vielleicht noch bisschen ausführlicher beschreiben, wer wann was warum macht, alle Abläufe und Interaktionen
 

GilbertGrape

Bekanntes Mitglied
Ja stimmt, du hast recht. Das is ziemlich dämlich.
Ich hatte es auch erst ohne, aber dann dachte ich: naja, haste ne DB-Abfrage, machste eben einen extra-Thread, aber so geht das wohl nicht

Achso nochwas: Wenn ich es so lasse, also dass der Dialog auch in dem SwingWorker ausgeführt wird, ist das falsch? also wegen dem EDT?
 
S

SlaterB

Gast
solange nicht genau geklärt ist, was eigentlich passieren soll, kann man schlecht richtig oder falsch antworten,

ein extra-Thread ist im allgemeinen allerdings immer eine gute Idee,
nur man der nur Sinn, wenn damit die actionPerformed-Methode sofort beendet werden kann,
muss actionPerformed dagegen warten, so ist die GUI ja trotzdem die ganze Zeit blockiert,

wahrscheinlich wäre es also geschickt, die weiteren Aktionen der actionPerformed auch in den SwingWorker, vielleicht in die finished()-Methode zu stecken,
oder einen richigen Thread für alle diese Aufgaben zu verwenden,

dass aber nur ganz allgemein, weiß gar nicht was bei dir da so zu tun ist
 

GilbertGrape

Bekanntes Mitglied
Also es wird dann eben nur noch ein Dialog aufgerufen. Das heißt in mouseClicked passiert danach nichts mehr.

Ich dachte nur, ich hätte den Dialog aus dem EDT ausgelagert, aber wenn man das so machen kann...
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben