Status Anzeige-durch Thread?

Status
Nicht offen für weitere Antworten.
X

XMler

Gast
Hallo,

wenn ich ein normales JFrame mit SWING Elementen habe, und dann auf JButton Event etwas berechne, friert der Frame ja gewöhnlich ein und z.B. setText() Mehtoden der SWING Elemente werden erst nach der Berechnung umgesetzt.

Aber wenn ich wären der Berechnung eine Art Status JTextField haben möchte, wie mache ich das am Geschicktesten?

Ich dachte ich lasse den JFrame im eigenen Thread laufen und im 2 Thread dazu die Berechnung. Die beiden kommunizieren dann über Events.

Oder wie würdet ihr das machen? Habt ihr dazu vielleicht ein Beispiel?

Gruß
 

anfänger15

Bekanntes Mitglied
Generell benötigst du einen Thread für die Berechnungen und einen für die Fenster usw., da die Fenster betreits im AWT-Event-Thread laufen brauchst du also nur noch einen Thread der die Berechnungen ausführt. In dem Thread der die Berechnungen ausführt kannst du dann mit invokeLater von SwingUtilities den Status setzen.
 
X

XMler

Gast
oh, das hört sich gut an. Hast du dafür ein Beispiel? Das kenne ich noch nicht!
 
X

XMler

Gast
@SlaterB

reicht es aus wenn ich:

java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {

new JFrame();
}
});

so meine GUI starte und dann einfach in dem Berechnungsthread die SWING Elemente verändere?
 

Marco13

Top Contributor
Nein. Das Verändern muss i.a. explizit im Event-Dispatch-Thread gemacht werden (d.h. NICHT vom "Worker Thread").
Code:
void work()
{
    Thread worker = new Thread(new Runnable()
    {
        public void run()
        {
            while (true)
            {
                publish("This will take a while...");
            }
    });
    worker.start();
}


private void publish(String string)
{
    SwingUtilities.invokeLater(new Runnable()
    {
        public void run()
        {
            textField.setText(textField.getText()+"\n"+string);
        }
    });
}
(nur zur Verdeutlichung - näheres auf http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html und http://java.sun.com/docs/books/tutorial/uiswing/concurrency/ )
 
X

XMLler

Gast
MMh, irgendwie klappt das bei mir nicht. Der will nicht.

Ich habe das jetzt so gemacht!


class GUI extends JFrame
{
.
.
.
static JTextField Feld = new JTextField();

berechnung test = new berechnung();
test.Rechnung();
}

class berechnung
{
void Rechung()
{
.
.
.
while(true)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
GUI.Feld.setText("dargestellter Wert");
}
});
}
.
.
}
}

Tja, er zeigt so erst nach der Berechnung im JTextField den Wert den ich setzte an. Nicht wärend schon!
Wie sollte ich das ändern?
 

anfänger15

Bekanntes Mitglied
die Klasse berechnung (Klassen immer groß schreiben) muss von Thread erben und anstatt void Rechnung musst du dann die methode run überschreiben und den thread mit start() starten.
 

Niki

Top Contributor
Nimm dieses kleine Beispiel als Vorlage:
Code:
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

public class WorkerThreadDemo extends JFrame {

	private JLabel jlStatus = null;
	
	private JButton jbStart = null;

	public WorkerThreadDemo() {
		super("WorkerThreadDemo");
		guiInit();
		pack();
		setLocationRelativeTo(null);
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
	}

	private void guiInit() {
		Container cont = getContentPane();
		cont.setLayout(new BorderLayout());
		jlStatus = new JLabel("Status: ");
		jbStart = new JButton("Start");
		cont.add(jlStatus, BorderLayout.SOUTH);
		cont.add(jbStart, BorderLayout.NORTH);
		
		jbStart.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				work();
				
			}
		});
	}
	
	private void work(){
		new Thread(new Runnable(){
			public void run() {
				publish("Start");
				waitSekunden(3);
				publish("Verarbeiten");
				waitSekunden(3);
				publish("Fertig");
				
			}
		}).start();
	}
	
	private void waitSekunden(int sekunden){
		try {
			Thread.sleep(sekunden * 1000);
		} catch (InterruptedException e) {
			
		}
	}
	
	private void publish(final String string)
	{
	    SwingUtilities.invokeLater(new Runnable()
	    {
	        public void run()
	        {
	        	jlStatus.setText("Status: " + string);
	        }
	    });
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new WorkerThreadDemo().setVisible(true);

	}

}
 
X

XMLler

Gast
verdammt, ich raffs nicht! Ich kriege diesen Einbau so nicht mehr in mein Programm rein. Der Aufriss wäre zu groß.

Ich habe jetzt einfach in meinem JFrame ein weiteres JPanel eingefügt. In diesem läuft ein Thread in dem auf einen Event gelauscht wird, was in meiner Berechnung in den einzelnen Schritten gesendet wird. Hier der Code:

Code:
class Statuspanel extends JPanel
{
	JLabel Statusanzeige = new JLabel("bereit.");
	
	Statuspanel()
	{
		this.add(Statusanzeige);
		work();
	}
	
	private void work()
	{ 
	      new Thread(new Runnable()
	      { 
	         public void run() 
	         { 
	        	AWTEventListener ael = new AWTEventListener() 
	     		{
	     			  public void eventDispatched( AWTEvent event ) 
	     			  {	     			     				 
	     				  if (event.toString().contains("inhaltdesEvents"))
	     				  {
	     					 publish();
	     				  }   
	     			  }				
	     		};
	     		Toolkit.getDefaultToolkit().addAWTEventListener( ael, ActionEvent.ACTION_PERFORMED );	            
	         } 
	      }).start(); 
	  }
	
	private void publish() 
	{ 
	    SwingUtilities.invokeLater(new Runnable() 
	    { 
	        public void run() 
	        { 
	           Statuspanel.this.Statusanzeige.setText("text"); // wird leider erst nach der Berechnugn hinzugefügt, nicht wärend!!! 
	        } 
	    }); 
	}
}
 
S

SlaterB

Gast
wo kommt denn auf einmal ein AWTEventListener her?
das hat doch nichts mit Berechnungen, die eine zeitlang dauern, zu tun,

wenn du einen AWTEventListener adden willst, warum auch immer,
dann muss das nicht in einem Thread passieren, das dauert ja nur <1 ms,

wenn du dazu Fragen hast dann stelle sie, ein kleiner Hinweis
> wird leider erst nach der Berechnugn hinzugefügt, nicht wärend!!!

hilft mir zumindest nich, wie hängt denn der AWTEventListener mit den Berechnungen zusammen?
ok, es soll wohl ein Event mit 'inhaltdesEvents' vorbeikommen,
passiert das? wann? (mit System.out.println im Listener testen)

vielleicht kommt das Event ja erst nach 'den Berechnungen',
dann kann auch das TextFeld nicht per Zauberhand in der Vergangenheit aktualisiert werden,
dann ist der AWTEventListener nicht schuld, sondern der Code, der das Event erst so spät abschickt
oder es wird erst spät weitergeleitet weil die GUI solange blockiert ist
 
X

XMLler

Gast
ja, das Programm kommuniziert über diese Events.

Immer wenn ein Berechnungsschritt fertig ist, wird so ein Event gesendet und dann soll das angezeigt werden.
Aber mach dir darum keine Sorgen, das funktioniert!

Code:
AWTEventListener ael = new AWTEventListener() 
	     		{
	     			  public void eventDispatched( AWTEvent event ) 
	     			  {	     			     				 
	     				  if (event.toString().contains("###"))
	     				  {
	     					 publish();
	     					 System.out.println("Event kamm richtig an!!!"); // funktioniert einwandfrei auf der Konsole
	     				  }   
	     			  }				
	     		};
	     		Toolkit.getDefaultToolkit().addAWTEventListener( ael, ActionEvent.ACTION_PERFORMED );

So klappt alles wunderbar. Nur das Swing Objekt will nicht!!!
 
S

SlaterB

Gast
nun, dann kann man den Fehler aus deinem Code nicht wirklich erkennen,
vielleicht ist es ja was banales, z.B. dass Statusanzeige gar nicht in der GUI angezeigt wird sondern ein anderes TextField
(edit: ok, widerspricht > wird leider erst nach der Berechnugn hinzugefügt)

bei mir gehts jedenfalls:

Code:
public class TestGUI
    extends JFrame
{
    JTextField tf = new JTextField(20);

    public TestGUI()
        throws Exception
    {


        add(tf, BorderLayout.CENTER);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(200, 100);
        setVisible(true);

        AWTEventListener ael = new AWTEventListener()
            {
                public void eventDispatched(AWTEvent event)
                {
                    if (event.toString().contains("###"))
                    {
                        publish();
                        System.out.println("Event kamm richtig an!!!");
                    }
                }
            };
        Toolkit.getDefaultToolkit().addAWTEventListener(ael, ActionEvent.ACTION_PERFORMED);

        Runnable r = new Runnable()
            {

                public void run()
                {
                    for (int i = 0; i < 10; i++)
                    {
                        Event e = new Event(new Object(), ActionEvent.ACTION_PERFORMED, null);
                        AWTEvent ae = new AWTEvent(e)
                            {
                                public String toString()
                                {
                                    return "###";
                                }
                            };
                        dispatchEvent(ae);
                        try
                        {
                            Thread.sleep(1000);
                        }
                        catch (InterruptedException ex)
                        {
                            ex.printStackTrace();
                        }
                    }
                }

            };
        new Thread(r).start();

    }

    private void publish()
    {
        SwingUtilities.invokeLater(new Runnable()
            {
                public void run()
                {
                    TestGUI.this.tf.setText("text" + (Math.random() * 2000));
                }
            });
    }


    public static void main(String[] args)
        throws Exception
    {
        new TestGUI();
    }


}
 
X

XMLer

Gast
Erstmal danke für deine/eure Mühen.

Denke ich weis jetzt was ich falsch gemacht habe. Bei mir läuft die Erfassung des Events in einem externen Thread. Die Berechnung läuft genau wie das GUI im gleichen. Das ist ein Problem für mich, weil sich das mal nicht auf die Schnelle ändern lässt. Tja, da mus ich mal schauen was sich da machen lässt!

Machts erstmal gut!
cu
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Robertop Status von Caps- und NumLock auslesen Allgemeine Java-Themen 1
F WireGuard Status auslesen Allgemeine Java-Themen 3
E Status eines USB Mikrofon abfragen Allgemeine Java-Themen 2
G Threads Methode nebenbei ausführen, Status verarbeiten Allgemeine Java-Themen 4
N Thread interrupt Status debuggen Allgemeine Java-Themen 6
S How to add job-status(bubbles) to a new column? (Extend Jenkins) Allgemeine Java-Themen 3
K kontinuierlich aktuelle Bestellsystem-Liste mit farbigem Status Allgemeine Java-Themen 2
D Methoden Thread Schleife Status Allgemeine Java-Themen 7
H SQL DriverManager Status Allgemeine Java-Themen 5
D Focus und Status Allgemeine Java-Themen 2
W ICQ Status Abfrage mit Java Allgemeine Java-Themen 3
Iron Monkey Listening for Print Service Status Changes Allgemeine Java-Themen 2
B Main Thread Status abrufen Allgemeine Java-Themen 4
G Status beim Upload einer Datei Allgemeine Java-Themen 2
G Prozess-Status Allgemeine Java-Themen 8
M Windows Dienste << Status >> Allgemeine Java-Themen 11
L Status eines Applets sichern Allgemeine Java-Themen 6
kodela JHelp - Anzeige im Navigator Allgemeine Java-Themen 11
M Java (GUI) Code verdoppeln oder anzeige mehrmals anzeigen? Allgemeine Java-Themen 8
S Bilder/Grafiken (zb: ".jpg") gestaucht zu Anzeige bringen Allgemeine Java-Themen 4
D Datenbankabruff mit Progressbar anzeige Allgemeine Java-Themen 5
R PDF Anzeige Allgemeine Java-Themen 4
M Acrobat Viewer Bean - EULA-Anzeige verhindern Allgemeine Java-Themen 4
M Problem bei PDF-Anzeige mittels Acrobat Viewer Bean Allgemeine Java-Themen 2
G HTML-Seite im Frame Anzeige? Allgemeine Java-Themen 3
MQue Anzeige mit Label kombinieren Allgemeine Java-Themen 4
L 7-Segment-Anzeige Allgemeine Java-Themen 16
A Speicher/Anzeige Problem in JTable Allgemeine Java-Themen 2
K PDF PlugIn zur Anzeige/Druck von PDF's Allgemeine Java-Themen 7
K JTree Inhalt löschen und Anzeige aktualisieren Allgemeine Java-Themen 13
T Musik Spektrum Anzeige erzeugen Allgemeine Java-Themen 17
D FileOpenDialog dauert 23 Sekunden bis zur Anzeige Allgemeine Java-Themen 2
V Java-Codierungsherausforderung: Navigieren durch die Macken der Datumsmanipulation Allgemeine Java-Themen 2
H Dienst durch ssh forwarding absichern? Allgemeine Java-Themen 15
M Klasse durch Klassen Aufteilung verbessern, aber wo? Allgemeine Java-Themen 1
M Kein Scanner Fehler durch falsche EIngabe Allgemeine Java-Themen 4
P Karate API Test läuft nicht durch . initializationError Allgemeine Java-Themen 21
Y Wie bekomme ich durch getImage an das Image heran? Allgemeine Java-Themen 1
T Meine Frage lautet wie ich 2 CSV Dateien miteinander in Java verbinde und Spalten die zueinander gehören durch den gleichen Key zusammen ausgebe? Allgemeine Java-Themen 5
W Java Telegram Bot - Eingabe durch User Allgemeine Java-Themen 2
Drachenbauer Wie kann ich das Wort "concrete" in einem String durch ein anderes Wort ersetzen lassen? Allgemeine Java-Themen 5
I Buchstabe durch seinen Nachfolger ersetzen Allgemeine Java-Themen 29
M Jdeps-Error durch multi-release Allgemeine Java-Themen 6
J Reflection Aufruf: .class durch .dll ersetzen Allgemeine Java-Themen 4
mrbig2017 Threads wait wird nicht durch notify beendet! Allgemeine Java-Themen 3
C OpenCl Setup und durch JavaCode ansteuern Allgemeine Java-Themen 17
J Erste Schritte Datenspeicherung durch Java Allgemeine Java-Themen 6
M Hässliche Schrift auf Graphics durch deriveFont Allgemeine Java-Themen 0
R Variable durch mehrere Methoden ändern und nutzen Allgemeine Java-Themen 17
Aruetiise Interface Position durch JButton ermitteln Allgemeine Java-Themen 5
K Jar/DLL Abhängigkeiten durch User angeben lassen Allgemeine Java-Themen 6
4 Swing Durch klicken auf Button Labels einem Panel hinzufügen Allgemeine Java-Themen 4
R Rückgabe eines Arrays durch Funktion Allgemeine Java-Themen 9
T AWT AWT-EventQueue-0 Null_Pointer_Exception durch Variable Allgemeine Java-Themen 12
RalleYTN Problem bei Schleife die durch einen 2D raum iterieren soll Allgemeine Java-Themen 1
C Durch klicken von Button in GUI wird leeres Fenster geöffnet und nicht mein Spiel "Memory" Allgemeine Java-Themen 13
T Quadrieren einer Zahl nur durch Addition Allgemeine Java-Themen 5
L Vererbung If-Else ersetzen durch was? Allgemeine Java-Themen 20
K OOP OOP Gui Spiel + Vererbungen Probleme durch Nichtwissen!! Allgemeine Java-Themen 1
I CountDown wird durch JOptionPane unterbrochen Allgemeine Java-Themen 11
F JTable mit Zellen die sich durch andere Eingaben füllen Allgemeine Java-Themen 1
B Counting Sort (Sortieren durch Zählen) Allgemeine Java-Themen 13
Z Durch Bäume iterieren Allgemeine Java-Themen 3
M Unterbrechnung durch Echtzeitbefehle? Allgemeine Java-Themen 4
G Suchweg durch Binärbaum speichern Allgemeine Java-Themen 4
L Label- & Textfelderzeugung durch Button Allgemeine Java-Themen 1
S RandomAccessFile durch bytearrayinputstream ersetzen Allgemeine Java-Themen 4
H Java Leistungssteigerung durch Code Anpassung Allgemeine Java-Themen 5
H Optimierung durch Threads Allgemeine Java-Themen 31
S JTable: Model durch ein anderes ersetzen Allgemeine Java-Themen 2
P Variablen Auf durch for-Schleife generierte JComboBox zugreifen Allgemeine Java-Themen 3
T Code durch eigenes Frame pausieren (ähnlich JDialog) Allgemeine Java-Themen 4
F Live Ticker durch Screenshots Allgemeine Java-Themen 22
C Hex Zeichen ersetzen durch leer Zeichen Allgemeine Java-Themen 5
M Verschlüsselung von Text und Files durch RSA (Encoding Problem) Allgemeine Java-Themen 7
N Algorithmus durch Workflow Allgemeine Java-Themen 7
R Windows-Firewall lässt Java nicht durch Allgemeine Java-Themen 17
E Oracle kann durch 0 teilen !?! Allgemeine Java-Themen 7
E NetBeans Vector durch ArrayList ersetzen Allgemeine Java-Themen 4
J Java Datei durch Java Datei öffnen Allgemeine Java-Themen 16
M Arraynamen durch Variable festlegen lassen Allgemeine Java-Themen 5
R Implementierung eines Interface durch 2 verschiedene Klassen Allgemeine Java-Themen 6
S Bildaufbau durch Servlet -> Exception Allgemeine Java-Themen 11
F Slash durch Systembezogenen Fileseparator ersetzen Allgemeine Java-Themen 18
P JFormattedTextField für durch Semikolon getrennte Integer-Werte gesucht / Regulärer Ausdruck Allgemeine Java-Themen 3
M Eclipse drei slashs durch zwei ersetzen? Allgemeine Java-Themen 3
D Updaten von Klassen durch jar.exe zerstört diese. Update durch WinRAR gelingt! Allgemeine Java-Themen 2
A SWT Ausgabetext Shellscript durch Java Allgemeine Java-Themen 8
Ark Array durch Interface ersetzen Allgemeine Java-Themen 7
K Objekt einer konkreten Implementierung eines Interfaces durch übergebenen String Allgemeine Java-Themen 2
fastjack Hardwareinformationen durch Java auslesen Allgemeine Java-Themen 7
S durch Code steppen Allgemeine Java-Themen 7
E Durch System.in.read() blockierten Thread stoppen Allgemeine Java-Themen 10
M eigene Klasse durch Composition mit java.io.File erweitern Allgemeine Java-Themen 3
C Markierung durch Maus lesen Allgemeine Java-Themen 9
T Synchronisation von Listen bei Zugriffen durch mehrere Prozesse Allgemeine Java-Themen 15
N Scanner läuft nicht durch Allgemeine Java-Themen 2
F kamera auslösen durch Programm Allgemeine Java-Themen 17
M Maus durch JavaProgramm bewegen Allgemeine Java-Themen 2
Dissi Itext - Anordnung von Elementen durch PDF Writer Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben