Hallo,
ich wollte ein Programm (Client) schreiben, der auf einer JTextArea informationen ausgibt. Ich starte in in einer Methode inen Tread, der Text empfängt und diesen dann an eine Methode in der JFrameklasse übergibt, die ihn eigentlich in das JTextArea-Object schreiben sollte. Tut sie aber nicht. Ich habe den Code mal online gestellt. Diese Fassung ist etwas gekürzt, aber alles wichtige ist vorhanden. Alle Komentare die mit "//" anfangen sind aus dem Code, alle die mit "/*" anfangen und "*/" enden sind nur in der gekürzten Fassung vorhanden und beschreiben, was eigentlich in der Methode oä passiert.
Hier ist der Code:
Code:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
public class cframe extends JFrame implements ActionListener, AdjustmentListener
{
//Komponenten erzeugen
JTextArea out = new JTextArea();
JScrollPane sp= new JScrollPane(out);
/*weitere Komponenten werden hier (im original Code) eingefügt*/
//Variablen
/*Variablen erstellen*/
cframe()
{
//Titel
super ("Chat");
//Layouts setzten
p.setLayout (new BorderLayout());
/*weitere setLayoutMethoden*/
/*Komponenten zum entsprechenden Listener*/
//Komponenten zu Panel
p.add("Center",sp);
/*weitere Komponenten zu Panels*/
//WindowListener
/*WindowListener*/
setContentPane(p);
}
//EreignisBehandlung
public void actionPerformed(ActionEvent e)
{
Object g = e.getSource();
if (g==send)
{
/*CODE*/
}
if (g==end)
{
/*CODE*/
}
if (g==beginn)
{
/*weiterer Code*/
/*Hier wird ein Tread gestartet der die Methode "writeit(String)" aufruft*/
out.setText("DC hat eine Verbindung zu Empfang von Daten aufgebaut...");
}
repaint();
}
public void writeit (String lines)
{
String towrite = lines;
out.insert(lines,0);
System.out.println(towrite);
}
}
Komische Weise kann ich in "actionPerformed" noch "setText" anwenden, in "writeit(String)" allerdings nicht mehr.
Swing event-handling and painting code executes in a single thread, called the event-dispatching thread. This ensures that each event handler finishes executing before the next one executes and that painting isn't interrupted by events. To avoid the possibility of deadlock, you must take extreme care that Swing components and models are created, modified, and queried only from the event-dispatching thread.
Lernen! Ansonsten kannst du jede Programmiererkariere vergessen!
Was du benötigst ist wohl "invokeLater".
Das funktioniert etwa so:
Code:
// diese Methode fügt der Area einen neuen Text hinzu
public void appendText( final String text ){
Runnable run = new Runnable(){ // eine anonyme Klasse instanzieren
public void run(){
textArea.append( text ); // oder so ähnlich... einfach halt der JTextArea den Text hinzufügen.
}
};
SwingUtilities.invokeLater( run ); // DAS ist der wichtige Teil, hier wird der Thread mit Swing synchronisiert.
}