GUI Update /EDT

Turing0001

Aktives Mitglied
Hallo Leute,

ich stehe gerade auf dem Schlauch bei einem Problem mit dem Update der Oberfläche eines
kleinen Servers (Tipp des Tages). Dabei versuche ich in einer Schleife ein JTextField und eine
JTextArea zu aktualisieren (siehe Code). Obwohl das natürlich keine sehr gute Idee ist, würde
ich das Ganze gerne so zum Laufen bringen. Natürlich gibt es dabei das Problem der Blockade
des EDT. Ich habe bereits versucht, das Problem zu beheben mittels eines Timers bzw eines
separaten Threads (siehe Kommentare), aber nichts funktioniert. Es sollen in einem JTextField
die IP-Adresse des Servers und in der JTextArea Ip-Adresse und Portnummer aller verbundenen
Clients eingetragen werden. Da ich schon einige Jahre aus der Java-Programmierung raus bin,
wäre ich für jede Hilfe dankbar.
Hier der Code des Servers, der über eine GUI aufgerufen wird und Referenzen zu
jTextField und JTextArea mitbekommt. Ich hoffe, es ist okay wenn ich den Code hier einfach anhänge.
Da ich noch nie in einem Forum gepostet habe, besitze ich keinerlei Erfahrung. Sollte der modus
operandi ein anderer sein, bite ich um entsprechende Hinweise:
[CODE lang="java" title="Einfacher Server"]package mypackage;


import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.*;
import java.io.*;
import java.net.*;


import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;
import javax.swing.Timer;

public class server {



InetAddress ip;
String hostname;
int port;
Socket sock;

String[] tippListe={"Weniger Süßigkeiten essen!","Kaufen Sie sich was schönes!","Sagen Sie heute die Wahrheit","Mehr Programmieren Üben!","Knuddeln Sie Ihren Partner!"};





public void los(int port,JTextField tfip,JTextArea tacl)
{

try
{
ServerSocket servsock = new ServerSocket(port); // Verbindungsschnittstelle auf Port 4243 erstellen


while(true)
{

System.out.println("Hallo hier ist der Server auf Port " + port);
sock = servsock.accept(); // Warten auf "Anruf" von einem Client. accept() blockiert bis ein Client "anruft"
PrintWriter writer = new PrintWriter(sock.getOutputStream()); // Ausgabedatenleitung zum Clientsocket aufbauen...
String tipp = getTipp();
writer.println(tipp); // ... und die Daten an den Client senden

ip = InetAddress.getLocalHost(); // IP Adresse des Servers ermitteln
hostname = ip.getHostName();
// timer = new javax.swing.Timer(5,new ActionListener(){
// public void actionPerformed(ActionEvent ae){
// tfip.setText(ip.toString());
// tacl.append(" Clientadresse: " + sock.getInetAddress().toString() + " Portnummer: "+ sock.getPort() + System.lineSeparator());
// }
// });
// if (!timer.isRunning())
// {
// timer.start();
// System.out.println("Timer gestartet");
// }
//----------------------------------------------------------------
// new Thread(new Runnable()
// {
// public void run()
// {
//
// SwingUtilities.invokeLater(new Runnable()
// {
//
// public void run()
// {
// tfip.setText(ip.toString());
// tacl.append(" Clientadresse: " + sock.getInetAddress().toString() + " Portnummer: "+ sock.getPort() + System.lineSeparator());
// System.out.println("Komponenten aktualisiert!");
// }
// });
//
// }
// }).start();
tfip.setText(ip.toString());
tacl.append(" Clientadresse: " + sock.getInetAddress().toString() + " Portnummer: "+ sock.getPort() + System.lineSeparator());


System.out.println( "Text aus Textfeld und Textarea: " + tfip.getText() + " " + tacl.getText());

//System.out.println(ip + "\t" + hostname);
//System.out.println("Clientadresse: " + sock.getInetAddress() + " Portnummer: "+ sock.getPort());

writer.close(); // Ausgabedatenleitung wieder schließen
//servsock.close();
sock.close();
System.out.println(tipp);
}

}
catch (IOException ex){ex.printStackTrace();}
}

private String getTipp()
{
int zufall = (int)(Math.random()*tippListe.length);
return tippListe[zufall];
}




}

[/CODE]
 

Robert Zenz

Top Contributor
Ich rate mal und sage das "los" auf dem Swing-Thread aufgerufen wird? Damit wirst du immer dne Thread blockieren, es nuetzt dann auch nicht so viel darin dann einen Thread fuer das Update aufzureissen, "los" muss bereits in einem eigenen Thread laufen. Also einen neuen Thread erzeugen, und darin "los" ausfuehren.
 

Turing0001

Aktives Mitglied
Ich rate mal und sage das "los" auf dem Swing-Thread aufgerufen wird? Damit wirst du immer dne Thread blockieren, es nuetzt dann auch nicht so viel darin dann einen Thread fuer das Update aufzureissen, "los" muss bereits in einem eigenen Thread laufen. Also einen neuen Thread erzeugen, und darin "los" ausfuehren.
Hallo Robert,

Du bist mein Held!! Na klar, das war ein prinzipieller Denkfehler. Einfach den Aufruf in einen Thread gepackt und schon läuft es wie es soll.
Vielen, vielen Dank, da habe ich gestern ewig rumgetan. Der Sonntag ist gerettet. :)
 

Robert Zenz

Top Contributor
Vergiss nicht dass du dich auf den Swing Thread zurueck musst wenn du den Wert setzt. Das hast du ja bereits mit "SwingUtilities.invokeLater" gemacht. Das ist deswegen notwendig weil Aenderungen an Swing Controls nur vom Swing Thread aus passieren sollte, das betrifft auch neue Werte fuer die Anzeige. Eventuell ist hier dann "SwingUtilities.invokeAndWait" angebrachter, weil die Funktion erst zurueck kehrt wenn Swing den neuen Wert wirklich angezeigt hat (es bringt ja nichts 300 Werte zu holen wenn nur einer davon angezeigt wird).
 

Turing0001

Aktives Mitglied
Vergiss nicht dass du dich auf den Swing Thread zurueck musst wenn du den Wert setzt. Das hast du ja bereits mit "SwingUtilities.invokeLater" gemacht. Das ist deswegen notwendig weil Aenderungen an Swing Controls nur vom Swing Thread aus passieren sollte, das betrifft auch neue Werte fuer die Anzeige. Eventuell ist hier dann "SwingUtilities.invokeAndWait" angebrachter, weil die Funktion erst zurueck kehrt wenn Swing den neuen Wert wirklich angezeigt hat (es bringt ja nichts 300 Werte zu holen wenn nur einer davon angezeigt wird).
Hallo Robert,
das habe ich berücksichtigt, obwohl es auch ohne invokeLater/invokeAndWait funktioniert, aber so ist es sauberer. Vielen Dank nochmals, Du hast mir wiklich sehr geholfen.
 

mihe7

Top Contributor
Der war eigentlich nur zur Ergänzung für diejenigen gedacht, die später mal über den Thread stolpern. Du verwendest ja invokeLater. Hintergrund ist einfach der, dass die Swing-Komponenten nicht thread-safe verwendet werden können (ein paar Methoden bilden die Ausnahme, wie z. B. repaint), d. h. auch wenn es scheinbar funktioniert, ist es falsch, die Komponenten außerhalb des EDT zu manipulieren. Das kann in 99,99 % der Zeit funktionieren und plötzlich taucht ein scheinbar unerklärbares Phänomen an möglicherweise ganz anderer Stelle auf. Das sind m. E. die übelsten Probleme, die man überhaupt in Software haben kann: selten, nicht reproduzierbar, nicht lokalisierbar.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T ProgressBox - Update AWT, Swing, JavaFX & SWT 9
Ernesto95 JavaFX JavaFX GUI mit sehr vielen Update requests AWT, Swing, JavaFX & SWT 4
G update, paintComponent AWT, Swing, JavaFX & SWT 1
izoards JavaFX Concurrency Update UI AWT, Swing, JavaFX & SWT 35
ms_cikar Update swingUtilities Repaint in der Schleife AWT, Swing, JavaFX & SWT 3
J TableView Update/Refresh CPU AWT, Swing, JavaFX & SWT 2
A Verständnisfragen im Umgang mit update() und JFrames AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing JComboBox update der Daten AWT, Swing, JavaFX & SWT 8
blazingblade JavaFX Tableview Clock Column update AWT, Swing, JavaFX & SWT 5
R Update eines Labels bei Methodenaufruf einer anderen Klasse AWT, Swing, JavaFX & SWT 9
B Swing Update Swing Komponente bevor Methode startet. AWT, Swing, JavaFX & SWT 4
M JavaFX ComboBox: Update zur Laufzeit AWT, Swing, JavaFX & SWT 16
W Swing ProgressBar update AWT, Swing, JavaFX & SWT 4
B IconImage update im Tabbedpane AWT, Swing, JavaFX & SWT 3
M Update überschreiben klappt nicht AWT, Swing, JavaFX & SWT 4
Q JList Update Problem AWT, Swing, JavaFX & SWT 1
N Observer: update ruft nicht repaint auf AWT, Swing, JavaFX & SWT 0
M "Update" der JTable funktioniert nicht AWT, Swing, JavaFX & SWT 2
S Swing Update eine JTabelle nach einer Drag&Drop Operation AWT, Swing, JavaFX & SWT 0
C Swing Update von swing-TableModels per Thread. Eins geht, das andere nicht, warum? AWT, Swing, JavaFX & SWT 12
V Swing Update Textarea AWT, Swing, JavaFX & SWT 2
T Event Handling JFreeChart Update AWT, Swing, JavaFX & SWT 2
Farbtopf Live update JFreeChart AWT, Swing, JavaFX & SWT 3
F Swing GUI-Thread für automatisches Update nutzen AWT, Swing, JavaFX & SWT 10
El_Lobo Swing bei Update von Graphik Koordinatensystem nicht jedesmal neu zeichnen AWT, Swing, JavaFX & SWT 2
M Update JPanel AWT, Swing, JavaFX & SWT 12
N update model nach dem filtern AWT, Swing, JavaFX & SWT 2
E Umgang mit der Update Methode AWT, Swing, JavaFX & SWT 38
E Swing Update JTable AWT, Swing, JavaFX & SWT 6
L Update JTree Verzeichnisse AWT, Swing, JavaFX & SWT 9
G Swing Update-Funktion für Swing-Anwendung AWT, Swing, JavaFX & SWT 5
E Swing JTextField Listener nach Update?! AWT, Swing, JavaFX & SWT 2
D Swing JTable Problem bei automatischem update von Zellen AWT, Swing, JavaFX & SWT 3
P 2D-Grafik PaintComponent() übernimmt keine Werte aus update() AWT, Swing, JavaFX & SWT 8
D Swing update eines Labels nicht sichtbar AWT, Swing, JavaFX & SWT 9
N Tablle nach SQL-Update neu Laden AWT, Swing, JavaFX & SWT 4
M SWT grabExcessHorizontalSpace update ? refresh ? AWT, Swing, JavaFX & SWT 6
P Observer und GUI Update AWT, Swing, JavaFX & SWT 2
w0ddes Swing Update: Laufendes GUI updaten AWT, Swing, JavaFX & SWT 8
D JTable während edit kein update machen lassen AWT, Swing, JavaFX & SWT 2
M Swing Kein update bei simulierten HTML-Link AWT, Swing, JavaFX & SWT 4
C SWT Shell update probleme - Mausbewegung nötig AWT, Swing, JavaFX & SWT 2
hdi Swing GUI update vs. Process Speed AWT, Swing, JavaFX & SWT 31
hdi Swing Gui Update Problem (EDT) AWT, Swing, JavaFX & SWT 6
C JList update über tabbedPane? AWT, Swing, JavaFX & SWT 18
M Update einer JTEextArea AWT, Swing, JavaFX & SWT 2
H JTable mySQL Update AWT, Swing, JavaFX & SWT 8
S Update des fensters beim Ersetzen von JPanels AWT, Swing, JavaFX & SWT 9
G Features nach Update löschen AWT, Swing, JavaFX & SWT 2
J Fragen zur Vererbung und Update AWT, Swing, JavaFX & SWT 12
B Update von JLabels AWT, Swing, JavaFX & SWT 2
C Habe Probleme beim Bild laden! *Update 30.11.2006* AWT, Swing, JavaFX & SWT 28
C JTreeTable update Problem AWT, Swing, JavaFX & SWT 4
S Probleme mit dem Update einer JList AWT, Swing, JavaFX & SWT 7
B View zeichnet Daten aus dem Model ohne Update AWT, Swing, JavaFX & SWT 4
A Update von Frameinhalt und Scrollbar AWT, Swing, JavaFX & SWT 11
F MVC: Update von View und Controller AWT, Swing, JavaFX & SWT 5
C JTable update: Selektion beibehalten AWT, Swing, JavaFX & SWT 12
P paintComponent /paint/ update/ offscreenImage / Graphics2D / AWT, Swing, JavaFX & SWT 4
S JMenuBar + update AWT, Swing, JavaFX & SWT 3
G JTree - ungültiger selection update AWT, Swing, JavaFX & SWT 2
G Problem mit JLabel Update AWT, Swing, JavaFX & SWT 3
C [JTable] Update der Datenbank AWT, Swing, JavaFX & SWT 6
N update()-Methode für Canvas AWT, Swing, JavaFX & SWT 9
A problem mit update nach event, JSplitpane spinnt AWT, Swing, JavaFX & SWT 2
S Update von Grafik auf JPanel AWT, Swing, JavaFX & SWT 2
M GUI Update während der Verarbeitung einer Methode AWT, Swing, JavaFX & SWT 3
M update JTable AWT, Swing, JavaFX & SWT 3
T Problem bei Update von JTables in JTabbedPane AWT, Swing, JavaFX & SWT 2
D Problem beim Update von unsichtbaren JComponents mit Timern AWT, Swing, JavaFX & SWT 5
D Swing: GUI-Update-Problem AWT, Swing, JavaFX & SWT 3
J Warum funktioniert das Update des UI nicht? AWT, Swing, JavaFX & SWT 8
I GUI-Update-Probleme AWT, Swing, JavaFX & SWT 2
G Update von JPanel nach Buttonbetätigung AWT, Swing, JavaFX & SWT 1

Ähnliche Java Themen

Neue Themen


Oben