Threat und Rückgabewerte

Status
Nicht offen für weitere Antworten.

Tec

Mitglied
Hallo,

folgendes, habe ein Programm mit ner kleinen Oberfläche in SWING. Wenn ich nun auf nen Button drücke dann wird ein Threat aktiviert der irgendwas berechnet. So weit so gut, das Problem ist nun das was der Threat errechnet hat, in einem z.B. Textfeld anzuzeigen. Die Ausgabe per System.out.println in die Konsole klappt natürlich. Nur halt das übergeben in z.B. andere Funktionen klappt nicht.

Mir wärs lieb wenn der Threat sein Ergebnis irgendeiner Methode übergeben kann welche dann auf das Textfeld zugreift. Ich habs schon mit "Callable" probiert, allerdings hängt das Programm solange bis der Threat fertig ist mit seiner Berechnung. Das ist natürlich nicht erwünscht.

Hat jemand ne Lösung?
 

Sky

Top Contributor
Wenn es um ein Thread geht:

Der Thread braucht eine Referenz auf die GUI (oder mittels eines Controllers); sobald die Berechnungen abgeschlossen sind wird eine Methode "setResult" aufgerufen und schon ist das Ergebnis in der GUI
 

Tec

Mitglied
Ja es geht um einen Thread. Könntest mir mal bitte einen Beispielscode für sowas posten? Also nur ein kleiner Thread Aufruf der am Ende einen Return-Wert an das Textfeld übergibt so dass dieses dann diesen Wert darstellen kann. Wäre echt super! Vielen dank!!
 

Tec

Mitglied
Hab hier den Code mal bisl vereinfach dargestellt:

Code:
// der Button auf der Form welcher den Thread aktiviert
public void jButtonSenden_actionPerformed(ActionEvent e) {

int UebergabeWert=10;

RechnenThread t = new RechnenThread(UebergabeWert);
new Thread(t).start();

}



// Und hier mein Thread selber
public class RechnenThread implements Runnable {
  private int wert;

public RechnenThread(int uebergabewert) {
    this.wert = uebergabewert;
  }


public void run() {

// berechnet nun was

}


Das Problem ist nun das Ergebnis anzeigen zu lassen. Also sobald der RechnenThread fertig ist soll der Wert in einem Textfeld auf der Form dargestellt werden. Hab nur keine Ahnung wie ich den dahin bekomme. Der Thread liefert leider keinen Rückgabewert. Ausserdem darf das Programm nicht blockiert werden. Während also der Thread rechnet und sein Ergebnis dann in das Textfeld reinschreibt soll die Form noch zu 100% ansprechbar sein - sprich der User soll dort noch andere Aktionen ausführen können.
 
S

SlaterB

Gast
naja, wenn der Thread mal zwischendurch einen Wert ändert dürfe das für niemanden bemerkbar sein
(außer durch den neuen Text), da mach dir mal keine Sorgen,
hauptsache die Berechnung dafür läuft in einen anderen Thread falls sie lange dauert

damit irgendwo ein Text geändert werden kann muss irgendwie auf dieses JTextField-Objekt, oder was immer das ist, zugegriffen werden können, und das muss nun der Thread können, also braucht dieser die Referenz dafür oder für das umgebende Form/ JFrame oder was auch immer, irgendwie einen Weg dahin,

viele Wege führen nach Rom, am naheliegendsten wäre es die Referenz im Konstruktor mitzugeben,
entweder kennt die actionPerformed-Operation diese Referenz, dann kein Problem,
ansonsten verschiebt sich das Problem einfach eine Stufe weiter,
du musst dann eben dafür sorgen dass die actionPerformed-Operation die Referenz kennt ;)
falls diese in einer getrennten Klasse liegt dann hat diese Klasse sicherlich auch einen Konstruktor der wiederum
die Referenz als Parameter erhalten könnte, bei dir siehst so aus als wäre das eine Operation im Frame/ Form?
dann dürfe es einfach sein

Code:
// der Button auf der Form welcher den Thread aktiviert
public void jButtonSenden_actionPerformed(ActionEvent e) {

  int UebergabeWert=10;

  RechnenThread t = new RechnenThread(UebergabeWert, this);
  new Thread(t).start();

}



// Und hier mein Thread selber
public class RechnenThread implements Runnable {
  private int wert;
  private MyFrame frame

  public RechnenThread(int uebergabewert, MyFrame newFrame) {
    this.wert = uebergabewert;
    frame = newFrame;
  }


public void run() {

   // berechnet nun was
   frame.setTextfieldText(blahblah);
}
 

Sky

Top Contributor
Zusätzlich eine Referenz auf sich selbst
Code:
new RechnenThread(UebergabeWert, this);

Code:
public RechnenThread(int uebergabewert, MeineKlasse mk) {
    this.wert = uebergabewert;
    this.meineKlasse = mk;
}
public void run() {

// berechnet nun was

// Berechnung ist zu ende. nun Methode aufrufen, die das Ergebnis übermittelt.
meineKlasse.meineMethode( meinWert );
}
 

Tec

Mitglied
Das erste Codebeispiel von dir hat wunderbar funktioniert! Vielen dank!!!! Hast mir den abend gerettet. :)
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben