Statusinformationen realtime ausgeben

Status
Nicht offen für weitere Antworten.

anubisxl

Mitglied
Hi, ich habe ein Programm mit einer GUI, wenn jetzt einzelne Methoden der Programmlogik aufgerufen werden sollen diese Statusinformationen in ein Textfeld schreiben, leider werden die Informationen aber erst wenn das Programm komplett abgelaufen ist in dem Textfeld angezeigt, lässt sich das ändern?
Wenn ich das ganze mit Threads implementieren würde, müsste ich ja quasi jede Methode in eine eigene Klasse packen die dann Runnable implementiert, was etwas aufwendig wäre. Daher dachte ich man kann vielleicht einen eigenen Handler bauen, allerdings müsste ja dann jede Methode ein Ereignis (neueStatusInfoVorhanden) feuern wenn es etwas in das Statusfenster schreiben möchte.

Sind meine Überlegungen soweit schon mal richtig, oder habe ich da was falsch verstanden?

Hat jemand einen Tipp wie ich am besten an die Sache rangehe, vielleicht irgenwelche Tutorials oder so??

Greetz Anubis
 

Wildcard

Top Contributor
Richtig liegst du, wenn du sagst, dass du Threads brauchst, dass du für jede Methode eine Runnable Klasse brauchen sollst, ist für mich allerdings nicht nachvollziehbar.
 

anubisxl

Mitglied
Braucht nicht jeder Thread eine Methode run, in der dann der code der Methode steht, die ich ausführen möchte? Demnach müsste ich doch für jede Methode die als Thread laufen soll eine eigene Klasse erstellen, oder was habe ich da jetzt falsch verstanden?

Um meine Problem etwas zu konkretisieren: Ich habe im Prinzip 3 Methoden die sich gegenseitig beeinflussen sollen:

Klick auf Button start das Programm läuft unendlich lange und soll in Echtzeit Informationen in einem Satustextfeld ausgeben

Klick auf Button Stopp, das Programm wird unterbrochen.

Wie macht man das am Besten?
 
S

SlaterB

Gast
in einem Thread können auch mehrere Methoden gleichzeitig stehen
oder eben nur eine Methode, die 10 andere aufruft,

wenn da aber 5 verschiedene Buttons mit eigenen ActionListener hast,
dann ist es korrekt, dass für jede dieser 5 'Aktionen' (nennen wir es mal lieber so) ein Thread zu bauen ist, ja,

eine Alternative wäre anstatt ActionListener eine eigene Klasse RunnableActionListener,
der dafür sorgt, dass die Aktion in der actionPerformed() automatisch nebenläufig ausgeführt wird,
dann hätte man diesen Aufwand nur einmal,

andererseits klingt z.B.
> Klick auf Button Stopp, das Programm wird unterbrochen.
nicht nach etwas, was länger als eine Milliesekunde dauert,
dann braucht es auch keinen Thread

> allerdings müsste ja dann jede Methode ein Ereignis (neueStatusInfoVorhanden) feuern wenn es etwas in das Statusfenster schreiben möchte.

gleich ein Ereignis klingt übertrieben, aber bisschen Aufwand ist jeweils schon, aus einem Thread die GUI zu aktualisieren,

mit einer eigenen Basisklasse RunnableActionListener für alle deartigen Aktionen hättest du wieder evtl. den Vorteil,
Dinge in Hilfsmethoden auszulagern und nicht doppelt implementieren zu müssen,
was immer du auch genau vorhast
 

foobar

Top Contributor
anubisxl hat gesagt.:
Braucht nicht jeder Thread eine Methode run, in der dann der code der Methode steht, die ich ausführen möchte? Demnach müsste ich doch für jede Methode die als Thread laufen soll eine eigene Klasse erstellen, oder was habe ich da jetzt falsch verstanden?

Um meine Problem etwas zu konkretisieren: Ich habe im Prinzip 3 Methoden die sich gegenseitig beeinflussen sollen:

Klick auf Button start das Programm läuft unendlich lange und soll in Echtzeit Informationen in einem Satustextfeld ausgeben

Klick auf Button Stopp, das Programm wird unterbrochen.

Wie macht man das am Besten?

In dem Beispiel sehe ich nur einen zusätzlichen Thread der irgendwelche Berechnungen durchführt und im Statusfeld ausgibt. Beim Klick auf den Startbutton wird der Thread initialisiert und gestartet und beim Klick auf den Stopp-Button wieder durch interrupt() sauber beendet.

Code:
class MyFrame extends JFrame
{
   private Thread thrRunner;

  public void startThread()
  {
      if (null == thrRunner)
     {
         thrRunner = new MyThread(); 
    }
     thrRunner.start();

  }

  public void stopThread()
  {
      if (null != thrRunner)
     {
         thrRunner.interrupt();
         thrRunner = null;
    }
 }

 private class MyThread extends Thread
 {
     public void run()
    {
        while (!isInterrupted())
       {
          // do something  
      } 
   }
}
}


Wenn der Thread auf die GUI zugreifen soll benutz du aber besser den Kerl hier: http://java.sun.com/javase/6/docs/api/javax/swing/SwingWorker.html
 

anubisxl

Mitglied
Das sieht schon mal sehr gut aus! Danke!
Jetzt hab ich nur ein Problem, ich habe in der auszuführenden Methode öfter ein Thread.sleep() eingebaut wenn ich das deinen code einbaue, führt er den Thread bis in alle Ewigkeit aus, wo liegt denn da mein Denkfehler?

Code:
public static void main(String[] args) {

    startThread();
        try {
            Thread.sleep(20);
        } catch (InterruptedException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }

    stopThread();

    }

der Thread:

Code:
public class MyThread extends Thread{

    
    @Override
     public void run()
    {
        while (!isInterrupted())
       {
            System.out.println("not interrupted yet");
            try {
                Thread.sleep(5);
            } catch (InterruptedException ex) {
                Logger.getLogger(MyThread.class.getName()).log(Level.SEVERE, null, ex);
            }

      }
   }

}
 

foobar

Top Contributor
Vielleicht greifst du auf den falschen Thread zu. Versuch mal das hier:

Code:
while (!isInterrupted())
       {
            System.out.println("not interrupted yet");
            try {
                Thread.currentThread().sleep(5);
            } catch (InterruptedException ex) {
                Logger.getLogger(MyThread.class.getName()).log(Level.SEVERE, null, ex);
            }

      }

Du kannst dir auch mit Thread.getName() den Namen deines Threads ausgeben lassen, dann siehste besser was passiert.
 
S

SlaterB

Gast
ich beobachte das bei mir auch:
Code:
public class Test {

	private static Thread thrRunner;

	public static void main(String[] args) throws Exception {

		startThread();
		try {
			Thread.sleep(200);
		} catch (InterruptedException ex) {
			ex.printStackTrace();
		}
		stopThread();
	}

	public static void startThread() {
		if (null == thrRunner) {
			thrRunner = new MyThread();
		}
		thrRunner.start();
	}

	public static void stopThread() {
		if (null != thrRunner) {
			System.out.println("gleich interrupt");
			thrRunner.interrupt();
			thrRunner = null;
		}
	}

}

class MyThread extends Thread {
	public void run() {
		while (!isInterrupted()) {
			System.out.println("not interrupted yet");
			try {
				Thread.sleep(1000);
			} catch (InterruptedException ex) {
				System.out.println("interrupt: " + isInterrupted());
			}
		}
	}
}

Ausgabe:

not interrupted yet
gleich interrupt
interrupt: false
not interrupted yet
not interrupted yet
not interrupted yet

aber das ist ja ganz egal, ein überflüssiger Status den man leicht selber nachbauen kann,
genausogut also eine neue boolean-Variable definieren und auf true/ false setzen
 

Marco13

Top Contributor
Hm. Das Verhalten ist ... unintuitiv.... Von http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.html#interrupt() :


public void interrupt()

Interrupts this thread.

If this thread is blocked in an invocation of ... the ... sleep(long) .... methods of this class, then its interrupt status will be cleared and it will receive an InterruptedException.
....

If none of the previous conditions hold then this thread's interrupt status will be set.


Allgemein ist es wohl empfehlenswert, das Beenden eines threads NICHT über interrupt/isInterrupted" zu steuern, sondern mit einem eigenen Flag, von dem man genau weiß, wann man es auf welchen Wert setzt. Andernfalls muss man mit einer InterruptedException (wie sie im obigen Beispiel auftritt) richtig umgehen - hier steht ein bißchen was dazu http://www.javaspecialists.co.za/archive/Issue146.html
 

anubisxl

Mitglied
SlaterB hat gesagt.:
aber das ist ja ganz egal, ein überflüssiger Status den man leicht selber nachbauen kann,
genausogut also eine neue boolean-Variable definieren und auf true/ false setzen

Mit der variable läuft es super, werde es so machen.

Danke an Alle für die Tipps!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Swing JTextArea aus anderer Klasse in realtime aktualisieren AWT, Swing, JavaFX & SWT 3
T Swing bei Realtime-Aktualisierung zu langsam? AWT, Swing, JavaFX & SWT 10
G Button auswerten und ausgeben ob richtig oder falsch AWT, Swing, JavaFX & SWT 1
_user_q Versionscode aus build.gradle in Java-Klasse ausgeben lassen AWT, Swing, JavaFX & SWT 14
Encera ArrayList mit eigenen Objekten in JavaFX sortieren und ausgeben AWT, Swing, JavaFX & SWT 50
J Eingaben aus Textfield & ComboBox speichern und in ComboBox wieder ausgeben AWT, Swing, JavaFX & SWT 3
donnico2 Objekte in der GUI ausgeben mit Hilfe einer DAO AWT, Swing, JavaFX & SWT 1
A Titelleiste soll Pfad ausgeben AWT, Swing, JavaFX & SWT 16
P Swing Zufallsbilder auf Frame ausgeben AWT, Swing, JavaFX & SWT 1
T Anderen Java Code durch Code kompilieren und Fehler in Label ausgeben AWT, Swing, JavaFX & SWT 5
M Swing Objekt Array in GUI ausgeben AWT, Swing, JavaFX & SWT 1
B Textfelder in einer ListView ausgeben AWT, Swing, JavaFX & SWT 13
G Eingabe in JTextField in Array speichern und in JList ausgeben AWT, Swing, JavaFX & SWT 7
S GUI Kreuz zeichnen und Position ausgeben AWT, Swing, JavaFX & SWT 3
J Datensatz in jTable ausgeben AWT, Swing, JavaFX & SWT 3
M JavaFX JavaFX ResultSet in TableView ausgeben AWT, Swing, JavaFX & SWT 2
J Event Handling Input auf String testen, Fehlermeldung ausgeben AWT, Swing, JavaFX & SWT 4
T [Neuling] Textfeld Inhalt überprüfen und falsche Stellen als msg Ausgeben AWT, Swing, JavaFX & SWT 1
T JOptionPane Dialog plus Rechnung ausgeben AWT, Swing, JavaFX & SWT 1
K Swing GridLayout - x und y bei Mausklick ausgeben AWT, Swing, JavaFX & SWT 4
sandaime Swing 3 JComboBoxen ausgelesen Elemente einzel ausgeben AWT, Swing, JavaFX & SWT 6
C JavaFX mehrere Kreise nach Eingabeprozess ausgeben AWT, Swing, JavaFX & SWT 2
S Höhendaten in einer Grafik ausgeben AWT, Swing, JavaFX & SWT 2
L Array mit JButton, wie rausfinden auf welche JButton geklickt wurde + index des JButtons ausgeben AWT, Swing, JavaFX & SWT 4
K Pfad mit JFileChooser ausgeben lassen AWT, Swing, JavaFX & SWT 7
B Map, Set oder List in GUI ausgeben AWT, Swing, JavaFX & SWT 5
F Swing String[] in JTextArea ausgeben. Jeder Eintrag in neue Zeile, aber ohne "\n"- Geht das? AWT, Swing, JavaFX & SWT 3
B Text auf Display ausgeben [LWJGL] AWT, Swing, JavaFX & SWT 2
V GUI mit Swing -> Wenn IP eingegeben Domain ausgeben AWT, Swing, JavaFX & SWT 15
precoc Konsole in GUI ausgeben AWT, Swing, JavaFX & SWT 8
MiMa Dateien aus Ordner in einer JList Ausgeben AWT, Swing, JavaFX & SWT 32
MiMa Integer Zahl in Textfield ausgeben AWT, Swing, JavaFX & SWT 12
P Elemente einer JList ausgeben AWT, Swing, JavaFX & SWT 11
B Swing Komponente an Position eines Objektes ausgeben lassen AWT, Swing, JavaFX & SWT 3
A mehrere Zeilen in GUi ausgeben AWT, Swing, JavaFX & SWT 2
P Binärbaum grafisch ausgeben AWT, Swing, JavaFX & SWT 4
D SpinnerDateModel NUR Uhrzeit ausgeben AWT, Swing, JavaFX & SWT 7
C ausgewählte JtoggleButton als Variablenwert ausgeben AWT, Swing, JavaFX & SWT 14
C Konsolenausgabe in TextArea ausgeben AWT, Swing, JavaFX & SWT 8
T jSlider-Value als Float in jLabel ausgeben AWT, Swing, JavaFX & SWT 2
J Bitmaps nebeneinander ausgeben AWT, Swing, JavaFX & SWT 4
A Formatierten String ausgeben (drawString) AWT, Swing, JavaFX & SWT 5
M Swing Eine andere Klasse über Button starten und in TextArea ausgeben AWT, Swing, JavaFX & SWT 13
S Swing Grundprinzip String ausgeben, aber wie? AWT, Swing, JavaFX & SWT 6
S AWT Arrays in externer jTable Klasse ausgeben AWT, Swing, JavaFX & SWT 3
P Datenelement anderer Klasse in JTextArea ausgeben AWT, Swing, JavaFX & SWT 4
M Swing Eingabe auf JTextField automatisch ausgeben auf JLabel AWT, Swing, JavaFX & SWT 2
maddin86 Eingabe in Textfeld 1 synchron in Textfeld 2 ausgeben AWT, Swing, JavaFX & SWT 9
R String in JFrame ausgeben AWT, Swing, JavaFX & SWT 10
H Swing variable in Numberfield ausgeben AWT, Swing, JavaFX & SWT 5
P Swing ComboBox(en) in JTable auslesen und ausgeben AWT, Swing, JavaFX & SWT 11
D Event in Fenster ausgeben + Observer + kein Plan AWT, Swing, JavaFX & SWT 2
H Rechteck grafisch ausgeben (2D) AWT, Swing, JavaFX & SWT 3
C Value eines RadioButtons ausgeben AWT, Swing, JavaFX & SWT 6
S SWT Fehlermeldung ausgeben AWT, Swing, JavaFX & SWT 7
D Feedback in Fenster ausgeben AWT, Swing, JavaFX & SWT 4
B Exceptions werfen und in JTextArea ausgeben AWT, Swing, JavaFX & SWT 4
S Würfelnetz in Java ausgeben möglich? AWT, Swing, JavaFX & SWT 4
P List in JTextField ausgeben AWT, Swing, JavaFX & SWT 8
R for-Schleife in Applet ausgeben AWT, Swing, JavaFX & SWT 3
J DB in JTable ausgeben... AWT, Swing, JavaFX & SWT 3
T ArrayList aus KlasseA in KlasseB in JTextArea ausgeben AWT, Swing, JavaFX & SWT 12
N Swing JList Elemente ausgeben fehlerhaft AWT, Swing, JavaFX & SWT 4
S Arrayinhalt nach Klicken des Buttons im Fenster ausgeben AWT, Swing, JavaFX & SWT 27
radiac AWT Mausposition als String ausgeben??? AWT, Swing, JavaFX & SWT 5
T Texte farbig ausgeben AWT, Swing, JavaFX & SWT 2
D Objekt (Map) in Textfeld ausgeben AWT, Swing, JavaFX & SWT 10
G Process in JTextArea ausgeben AWT, Swing, JavaFX & SWT 4
T Swing Sql Tabellen in jList ausgeben und speichern AWT, Swing, JavaFX & SWT 4
B Datensätze einer Datenbank in JTable ausgeben AWT, Swing, JavaFX & SWT 14
L SWT-Table: Datum ausgeben? AWT, Swing, JavaFX & SWT 5
G Markierte MenüItems des JCombobox - Popups ausgeben AWT, Swing, JavaFX & SWT 7
R Flächeninhalt ausgeben AWT, Swing, JavaFX & SWT 7
A Dateien in TextArea ausgeben AWT, Swing, JavaFX & SWT 6
L DOS-Rückgabe auf einem JPanel ausgeben AWT, Swing, JavaFX & SWT 5
G Zeilenweise ausgeben! AWT, Swing, JavaFX & SWT 2
X JTextArea Text ausgeben mit setText(a) aber wie? AWT, Swing, JavaFX & SWT 3
A JTable: Zeit in Spalte ausgeben AWT, Swing, JavaFX & SWT 2
G Datensätze aus DB in TextFeld ausgeben AWT, Swing, JavaFX & SWT 18
L JTree Frage -> nur den Wert des Knotens ausgeben? AWT, Swing, JavaFX & SWT 2
L nur den JTree Knoten auf der Console ausgeben? AWT, Swing, JavaFX & SWT 6
G Textfeld auslesen und auf der Konsole ausgeben? AWT, Swing, JavaFX & SWT 10
A Strings in JTable fett ausgeben - ohne! HTML AWT, Swing, JavaFX & SWT 10
G Aktuelle Mausposition auslesen und ausgeben AWT, Swing, JavaFX & SWT 2
H Text auf JLabel ausgeben? AWT, Swing, JavaFX & SWT 2
L Farbregler - Werte als Zahl ausgeben - Color AWT, Swing, JavaFX & SWT 5
R einige wörter fettgedruckt ausgeben AWT, Swing, JavaFX & SWT 2
G Bild ausgeben mit Swing AWT, Swing, JavaFX & SWT 8
L Header von ausgewählte Spalten ausgeben AWT, Swing, JavaFX & SWT 6
C Inhalte in immer das gleiche Fenster ausgeben? AWT, Swing, JavaFX & SWT 3
R Gewählte Zeile aus JTable ausgeben lassen AWT, Swing, JavaFX & SWT 17
L 2 Dimensionales Array als Tabelle ausgeben lassen AWT, Swing, JavaFX & SWT 8
G Statistik grafisch ausgeben AWT, Swing, JavaFX & SWT 6
S mehrzeilige texte ausgeben AWT, Swing, JavaFX & SWT 10
R Wert von ScrollBar ausgeben AWT, Swing, JavaFX & SWT 7
M Mit JTextPane erstelltes Dokument als HTML-Code ausgeben AWT, Swing, JavaFX & SWT 4
T swing - grafik schrittweise ausgeben ohne repaint() AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen


Oben