JTextArea wird nicht aktualisiert (ActionListener-Problem)

matze999

Mitglied
Hallo,
ich hätte in meiner GUI gerne eine Art "Logger". Ich stelle mir das so vor, dass der Benutzer in der GUI über eine JTextArea darüber informiert wird, was die Anwendung gerade im Hintergrund macht.
Das Problem ist allerdings, dass bei folgendem Code die Zahlen 1-10 aus der zaehle()-Methode leider nicht nach und nach in der Textarea angezeigt werden, sondern erst nach kompletten Durchlauf der Methode.

Java:
import java.awt.Dimension;
import java.awt.GridLayout;
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.JTextArea;

public class FrameStarter extends JFrame {

	private JTextArea textArea = new JTextArea();
	private JLabel lbl = new JLabel("Hallo Welt");
	private JButton btn = new JButton("Button");

	public FrameStarter() {
		this.setLayout(new GridLayout(2, 1));
		textArea.setPreferredSize(new Dimension(300, 200));
		btn.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				if (e.getSource() == btn) {
					System.out.println("Test");
					machEtwas();
				}
			}
		});
		this.add(lbl);
		this.add(textArea);
		this.add(btn);
		this.pack();
		this.setVisible(true);
	}

	public void machEtwas() {
		AktionNeu aktion = new AktionNeu(textArea);
		aktion.zaehle();
	}

	public static void main(String[] args) {
		FrameStarter frameStarter = new FrameStarter();
		// frameStarter.machEtwas();
	}
}

 class AktionNeu {
	
	JTextArea textArea;
	
	public AktionNeu(JTextArea textarea) {
		this.textArea = textarea;
	}
	
	public void zaehle(){
		for (int i = 0; i < 10; i++) {
			try {
				Thread.sleep(1000);
				textArea.setText(textArea.getText() + "\r\n" + "Zeile: " + i);
//				repaint();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}

Das Problem scheint hierbei beim ActionListener zu liegen, da bei folgendem Code, wo es keinen ActionListener gibt, die Zahlen 1-10 nacheinander in der Textarea erscheinen

Java:
import java.awt.Dimension;
import java.awt.GridLayout;
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.JTextArea;

public class FrameStarter extends JFrame {

	private JTextArea textArea = new JTextArea();
	private JLabel lbl = new JLabel("Hallo Welt");
	private JButton btn = new JButton("Button");

	public FrameStarter() {
		this.setLayout(new GridLayout(2, 1));
		textArea.setPreferredSize(new Dimension(300, 200));
//		btn.addActionListener(new ActionListener() {
//
//			@Override
//			public void actionPerformed(ActionEvent e) {
//				if (e.getSource() == btn) {
//					System.out.println("Test");
//					machEtwas();
//				}
//			}
//		});
		this.add(lbl);
		this.add(textArea);
		this.add(btn);
		this.pack();
		this.setVisible(true);
	}

	public void machEtwas() {
		AktionNeu aktion = new AktionNeu(textArea);
		aktion.zaehle();
	}

	public static void main(String[] args) {
		FrameStarter frameStarter = new FrameStarter();
		frameStarter.machEtwas();
	}
}

 class AktionNeu {
	
	JTextArea textArea;
	
	public AktionNeu(JTextArea textarea) {
		this.textArea = textarea;
	}
	
	public void zaehle(){
		for (int i = 0; i < 10; i++) {
			try {
				Thread.sleep(1000);
				textArea.setText(textArea.getText() + "\r\n" + "Zeile: " + i);
//				repaint();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}

Meine Frage ist nun, wie kann ich es hinbekommen, dass mit dem ActionListener in der Textarea nach jedem Durchlauf der zaehle()-Methode meine Textarea aktualisiert wird? Also so wie es in dem zweiten Beispiel funktioniert, nur das hier eben kein ActionListener zum Einsatz kommt.

Ich hoffe ihr versteht was ich meine.

Vielen Dank schonmal
 
Zuletzt bearbeitet von einem Moderator:

Joose

Top Contributor
Das Problem ist allerdings, dass bei folgendem Code die Zahlen 1-10 aus der zaehle()-Methode leider nicht nach und nach in der Textarea angezeigt werden, sondern erst nach kompletten Durchlauf der Methode.

Der Grund dafür ist das deine Schleife bzw. das "sleep(1000)" darin den UI Thread (EDT) blockieren und dieser die Komponenten nicht neuzeichnen kann. (Alles was von einem ActionListener ausgelöst wird läuft im EDT ab)
Sprich du setzt einen neuen Content, willst die Komponente zeichnen lassen und bevor da passiert legst du den Thread schlafen. Sobald die Schleife beendet ist und kein sleep mehr kommt kann der EDT endlich neu zeichnen und du siehst leider alles auf 1x.

Die Lösung hierfür ist das Auslagern von der Schleife in einen neuen Thread.
Im Internet findet man zu diesem Problem genügend Beispiele und Lösungen, einfach mal nach "java UI blocks", "java ui edt blocked" und ähnlichen suchen.

Das Problem scheint hierbei beim ActionListener zu liegen, da bei folgendem Code, wo es keinen ActionListener gibt, die Zahlen 1-10 nacheinander in der Textarea erscheinen

Ohne ActionListener hast du genau das Konstrukt was die Lösung für das Problem mit ActionListener ist ;)
Sobald dein Programm startet gibt es einen Thread der die "main"-Methode abarbeitet. In dieser erstellst du ein neue Objekt von FrameStarter (das Zeichnen dieses Objekte wird vom EDT übernommen).
Die Methode zum Zählen und setzen des neuen Textes wird aber in der "main"-Methode aufgerufen und läuft daher in einem anderen Thread als dem EDT :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G JTextArea mit JScrollPane wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
N [erl.] Text JTextarea wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
J JTextArea wird nicht aktualisiert bei Zugriff von außerhalb AWT, Swing, JavaFX & SWT 2
B JTextArea wird nicht angezeigt | JFrame AWT, Swing, JavaFX & SWT 10
E Warum wird Text im JTextArea erst am Programmende angezeigt ? AWT, Swing, JavaFX & SWT 1
V JScrollBar soll weiterscrollen, wenn Inhalt von JTextArea erweitert wird AWT, Swing, JavaFX & SWT 7
T Swing Mehrere Ausgaben in JTextArea AWT, Swing, JavaFX & SWT 2
B JPanel-Inhalte inkl. JTextarea zoomen? AWT, Swing, JavaFX & SWT 3
P JTextarea (in JScrollPane) zeigt nur die beiden letzten Einträge an? AWT, Swing, JavaFX & SWT 0
RedEagle Swing JTextArea ist leer AWT, Swing, JavaFX & SWT 13
E wie in JScrollPane auf JTextArea zugreifen AWT, Swing, JavaFX & SWT 12
K Swing 2 JTextArea parrallel scrollable AWT, Swing, JavaFX & SWT 16
Hatsi09 JTextArea Inhalt verlinken AWT, Swing, JavaFX & SWT 4
ralfb1105 jTextArea Scrollbar hinzufügen - mit Jigloo erstellt AWT, Swing, JavaFX & SWT 7
S Ausgabe in JTextArea AWT, Swing, JavaFX & SWT 13
H JTextArea - farbige Zeilen .. bitte um Vorschläge zur Implementierung AWT, Swing, JavaFX & SWT 1
F 2D-Grafik JTextArea drucken bringt mieses Ergebnis AWT, Swing, JavaFX & SWT 2
Mario1409 Swing JTextArea scroll Problem AWT, Swing, JavaFX & SWT 0
Bluedaishi JTextArea gefundene Zeile nach Oben Scrollen AWT, Swing, JavaFX & SWT 13
S JTextArea Text nach oben wandern lassen AWT, Swing, JavaFX & SWT 7
Bluedaishi JtextArea AWT, Swing, JavaFX & SWT 6
Bluedaishi JDialog modal und JTextArea AWT, Swing, JavaFX & SWT 4
F JTextarea Steuern ~ consolenanbindung AWT, Swing, JavaFX & SWT 5
F Event Handling JTextArea auf bestimmte Eingabe reagieren (Return-Taste) AWT, Swing, JavaFX & SWT 2
F JTextArea hat keinen Rahmen AWT, Swing, JavaFX & SWT 10
N JTextArea Events weiterleiten AWT, Swing, JavaFX & SWT 3
R JTextArea mit verschiedenen Textfarben AWT, Swing, JavaFX & SWT 6
HoloYoitsu jTextArea.setCaretPosition(); What am I doing wrong? AWT, Swing, JavaFX & SWT 0
S Zeilenumbruch jTextArea mit toString AWT, Swing, JavaFX & SWT 2
F Swing String[] in JTextArea ausgeben. Jeder Eintrag in neue Zeile, aber ohne "\n"- Geht das? AWT, Swing, JavaFX & SWT 3
M JTextArea - Leertaste "sperren" AWT, Swing, JavaFX & SWT 1
S Inhalt der Java-Konsole in die JTextArea AWT, Swing, JavaFX & SWT 3
M Swing JTextArea mit ScrollBar AWT, Swing, JavaFX & SWT 9
S Swing Zahl der Zeilenumbrüche in einer JTextArea bestimmen AWT, Swing, JavaFX & SWT 1
F Swing Caret in JTextArea vergrößern AWT, Swing, JavaFX & SWT 2
D JTextArea auf KeyListener Command AWT, Swing, JavaFX & SWT 6
N JFrame änliches wie JTextArea? AWT, Swing, JavaFX & SWT 2
A Swing JTextArea - Multi-Line-Editing AWT, Swing, JavaFX & SWT 2
A Swing JTextArea aus anderer Klasse in realtime aktualisieren AWT, Swing, JavaFX & SWT 3
O JTextArea befüllen AWT, Swing, JavaFX & SWT 2
G JTextArea on the fly aus anderem Programm befüllen AWT, Swing, JavaFX & SWT 4
A Swing Einrücken mehrerer Zeilen per Tab in einem JTextPane/JTextArea AWT, Swing, JavaFX & SWT 3
T Swing Ausgabe aus ArrayList in Klasse1 in jTextArea in Klasse2 AWT, Swing, JavaFX & SWT 2
B JTextArea Größe an Container anpassen AWT, Swing, JavaFX & SWT 2
B Drucken der JTextArea AWT, Swing, JavaFX & SWT 4
M JTextArea Zeile hinzufügen AWT, Swing, JavaFX & SWT 4
C JTextArea scrollt bei append(String) aus Threads nicht ans Ende AWT, Swing, JavaFX & SWT 7
P JPanel- Listener durch JTextArea aktivieren AWT, Swing, JavaFX & SWT 8
A JTextArea - Zeichenbegrenzung nach .txt Datei import AWT, Swing, JavaFX & SWT 6
M Swing JScrollPane (Parent JTextArea) aktualisieren + neue Zeile AWT, Swing, JavaFX & SWT 5
Hoppelmann Swing Tasten in JTextArea blockieren AWT, Swing, JavaFX & SWT 2
S JTextArea Tastaturanschläge AWT, Swing, JavaFX & SWT 2
E Swing JTextArea in JFrame, wie nun WindowFocusListener implementieren? AWT, Swing, JavaFX & SWT 2
S Problem mit JButton und JTextArea AWT, Swing, JavaFX & SWT 2
J Swing Mitwachsende JTextArea+ JPanel AWT, Swing, JavaFX & SWT 4
P Swing JtextArea füllen mit setText AWT, Swing, JavaFX & SWT 7
M Probleme mit der Selektion einer JTextArea AWT, Swing, JavaFX & SWT 3
T Die Größe einer JTextArea an Ihren Parent JPanel anpassen. AWT, Swing, JavaFX & SWT 5
hdi Swing ListCellRenderer + JTextArea + LineWrap AWT, Swing, JavaFX & SWT 6
T ComponentOrientation in JTextArea AWT, Swing, JavaFX & SWT 3
H Hintergrundbild in jTextArea AWT, Swing, JavaFX & SWT 4
G Swing JTextArea mit fester Anzahl Spalten! AWT, Swing, JavaFX & SWT 10
G ein JTextArea in zwei JPanels AWT, Swing, JavaFX & SWT 2
L JTextArea mit JScrollPane AWT, Swing, JavaFX & SWT 7
padde479 Swing replace JTextArea funktioniert nicht AWT, Swing, JavaFX & SWT 2
L Zeilenumbrüche aus JTextArea MIT in Textdatei schreiben AWT, Swing, JavaFX & SWT 4
_dp jTextArea/jTextPanel Auto Höhe AWT, Swing, JavaFX & SWT 5
Ollek JTextArea - Feste Zeilenanzahl(8 Zeilen) AWT, Swing, JavaFX & SWT 3
S Swing JTextArea während der Laufzeit füllen AWT, Swing, JavaFX & SWT 5
Ollek Text in JTextField und JTextArea zur Laufzeit ändern AWT, Swing, JavaFX & SWT 6
P Datenelement anderer Klasse in JTextArea ausgeben AWT, Swing, JavaFX & SWT 4
P Scrollbar JTextArea AWT, Swing, JavaFX & SWT 23
M Swing Ausgabe in JTextArea verzögern AWT, Swing, JavaFX & SWT 7
T Swing jTextArea soll sich der Fenstergröße anpassen beim ziehen?? AWT, Swing, JavaFX & SWT 2
S System.out in JTextArea AWT, Swing, JavaFX & SWT 4
S Swing JTextArea - Bild auf/ab Tasten implementieren AWT, Swing, JavaFX & SWT 4
J JTextArea verschwindet bei resize vom JFrame AWT, Swing, JavaFX & SWT 2
VfL_Freak "setAccelerator/KeyStroke" bei JTextArea ? AWT, Swing, JavaFX & SWT 6
P Swing JTextArea - beim neuzeichnen bleibt manchmal weißer Kasten AWT, Swing, JavaFX & SWT 10
Dit_ JTextArea zu Zeile X scrollen AWT, Swing, JavaFX & SWT 4
H variable Höhe einer JTextArea (als Renderer/Editor) als Zelle einer JTable AWT, Swing, JavaFX & SWT 9
B Wechsel JTextArea und JComponent AWT, Swing, JavaFX & SWT 9
M [erledigt] Bestimmte Zeile aus JTextArea löschen AWT, Swing, JavaFX & SWT 3
G Swing JTable und JTextArea synchronisieren AWT, Swing, JavaFX & SWT 2
C JLabel, JTextArea, JScrollPane. repaint(); ? AWT, Swing, JavaFX & SWT 6
M JTextArea AWT, Swing, JavaFX & SWT 2
E Swing JTextArea Alternative? AWT, Swing, JavaFX & SWT 5
A Swing JTextArea über Frame hinaus anzeigen? AWT, Swing, JavaFX & SWT 2
S JInternalFrame oder JTextArea neu laden AWT, Swing, JavaFX & SWT 2
N JTextArea.setLineWrap Bug? AWT, Swing, JavaFX & SWT 3
N Swing JTextArea/JScrollpane: JScrollbar position AWT, Swing, JavaFX & SWT 8
I JTextArea mit Copy Paste Funktion AWT, Swing, JavaFX & SWT 7
M Swing JTextArea größe anpassen & setBackground liefer Nullpointer AWT, Swing, JavaFX & SWT 4
Plastagen JTextArea CaretPosition Aktualisierung AWT, Swing, JavaFX & SWT 10
C JTextField und JTextArea - Verständnisproblem AWT, Swing, JavaFX & SWT 14
B Exceptions werfen und in JTextArea ausgeben AWT, Swing, JavaFX & SWT 4
F new Line in JTextarea AWT, Swing, JavaFX & SWT 15
X Problem bei JTextArea und Thread.sleep() AWT, Swing, JavaFX & SWT 8
J Beliebtes Problem: Scrollbar in JTextArea AWT, Swing, JavaFX & SWT 4
w0ddes Swing JTextArea auf JScrollPane - Autoscroll?! AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben