Swing Gui Update Problem (EDT)

Status
Nicht offen für weitere Antworten.

hdi

Top Contributor
Hey, ich habe zwei Methoden in meinem JPanel, sie löschen jeweils Componenten und adden neue. Hier sind sie:

Java:
/**
	 * Setzt den Quellcode, der angezeigt wird.
	 * 
	 * @param quellcode
	 *            der neue Quellcode
	 */
	public void setInhalt(final String quellcode) {
		textArea.setText(quellcode);
		if (quellcode == null) {
			this.clear();
		} else {
			final JComponent th1s = this;
			EventQueue.invokeLater(new Runnable() {
				@Override
				public void run() {
					th1s.removeAll();
					setLayout(new BorderLayout());
					th1s.add(new JScrollPane(textArea), BorderLayout.CENTER);
					th1s.validate();
				}
			});
		}
	}

	/**
	 * Löscht den Quellcode und zeigt die Drag & Drop Information an
	 */
	public void clear() {

		final JComponent th1s = this;
		EventQueue.invokeLater(new Runnable() {
			@Override
			public void run() {
				th1s.removeAll();
				setLayout(new FlowLayout(FlowLayout.CENTER));
				th1s.add(info);
				th1s.validate();
			}
		});
	}

...die setInhalt() Methode funktioniert wunderbar. Die GUI macht immer schön ein Update. die clear() Methode allerdings kriegt das nicht hin. Hier ist es so, dass sich das Panel nicht verändert, erst wenn ich es resize...

Beide Methoden sind doch gleich aufgebaut, ich rufe schön brav ein validate() auf, laut API sollte es das dann auch gewesen sein. Und beide werden vom EDT verarbeitet.
Habt ihr irgendeine Idee wo man hier noch nach einem Fehler/Unterschied suchen könnte?

Wie kann ich zB herausfinden welcher Thread gerade diese Methoden aufruft? Eigentlich müsste es bei beiden der gleiche sein, aber wer weiss...

Bin um jede Hilfe froh, ich kämpf hier seit einer STunde, die eine Methode klappt immer perfekt, die andere klappt nie.

danke
 

Schandro

Top Contributor
versuchs mal mit revalidate() statt validate()

ansonsten:
Du kannst auch innerhalb einer inneren Klasse das this auf die äußere Klasse beziehen lassen:

KlassennameDerÄußerenKlasse.this
statt
this
 

hdi

Top Contributor
danke für den Tipp mit this.

revalidate() hatte ich auch schon versucht, ohne Ergebnis.

Ich würde nochmal auf meine Frage zurückkommen, wie ich prüfen kann welcher Thread die Methoden betritt. Vllt ist es wirklich ein verschiedener bei beiden Methoden. Ansonsten ist der code der Methoden ja nämlich eigentlich der gleiche. Wieso also sollte die eine immer gehen, die andere niemals :bahnhof:
 
S

SlaterB

Gast
Thread.getCurrentThread()

bau doch mal ein lauffähiges Beispiel zusammen
 

hdi

Top Contributor
Also ich fände es nett wenn ihr das mit mir zusammen rekonstruiert. Ich geh das ganze jetzt mit euch Step by Step durch, vllt versteht ihr dann wieso es hakt, weil ich verstehe es nicht.

Also das ganze wird ausgelöst durch Klick auf einen Button mit folgendem ActionListener:

Java:
class ClearAction implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent e) {
			new Thread() {
				@Override
				public void run() {
					parent.loescheWorkspace();
				}
			}.start();
		}
	}

Der EDT kommt also rein, startet schnell einen neuen Thread und geht wieder raus, ist also wieder ready.

die Methode ist nur ein kleiner Wrapper indem nur diese hier aufgerufen wird:

Java:
@Override
	public void loescheModelDaten() {
		model.setQuellcode(null);
		model.update(); 
	}

model.update() macht ein setChanged und notifyObservers auf den Observern. Der einzige Observer ist mein Haupt-Frame, d.h. seine update-Methode wird aufgerufen. Die update-Methode in meinem Frame sieht so aus:

Java:
@Override
	public void update(Observable obs, Object obj) {
		ModelImpl model = (ModelImpl) obs;
		editor.clear();
	}

letztendlich die clear-Methode:

Java:
	public void clear() {
		EventQueue.invokeLater(new Runnable() {
			@Override
			public void run() {
				EditorPanel.this.removeAll();
				EditorPanel.this.setLayout(new FlowLayout(FlowLayout.CENTER));
				EditorPanel.this.add(info);
				EditorPanel.this.validate();
			}
		});
	}

So, und hier ist genau der Moment, wo er nicht das tut, was im Code steht.
Er macht zwar ein repaint nach removeAll(), also der Editor wird leer, aber er zeigt
nicht das "info" an, was ja geaddet wurde.
Erst, wenn ich das Editor-Fenster resize.

Warum macht der EDT hier nur halbe Arbeit? Es ist immer das selbe, also scheinbar deterministisches Verhalten. Aber warum ?

Bin echt superfroh über Hilfe, dieses EDT-Thema ist für mich noch immer ein Rätsel, weil es mich jedesmal auf's neue überrascht, wenn ich dachte es verstanden zu haben :(
 
S

SlaterB

Gast
warum es nötig ist weiß ich grad auch nicht und hab bisschen probiert, aber nichts wirklich inhaltlich interessantes gefunden,
jedenfalls brauchst du einen repaint()-Aufruf
Java:
public class TestGUI extends JFrame {


	public TestGUI() {

		final EditorPanel editor = new EditorPanel();
		editor.setInhalt("text");
		editor.setBackground(Color.YELLOW);
		add(editor);

		Model model = new Model(editor);
		Parent parent = new Parent(model);
		ClearAction clearAction = new ClearAction(parent);

		JButton clearButton = new JButton("Clear");
		clearButton.addActionListener(clearAction);

		add(clearButton, BorderLayout.SOUTH);

		JButton setButton = new JButton("Set");
		setButton.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				editor.setInhalt("neuer Inhalt " + Math.random());
			}

		});

		add(setButton, BorderLayout.NORTH);

		setSize(400, 300);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);

	}

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

}

class ClearAction implements ActionListener {
	Parent parent;

	public ClearAction(Parent parent) {
		this.parent = parent;
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		new Thread() {
			@Override
			public void run() {
				parent.loescheWorkspace();
			}
		}.start();
	}
}

class Parent {
	Model model;

	public Parent(Model model) {
		this.model = model;
	}

	public void loescheModelDaten() {
		model.setQuellcode(null);
		model.update();
	}

	public void loescheWorkspace() {
		loescheModelDaten();
	}

}

class Model {

	EditorPanel editor;

	public Model(EditorPanel editor) {
		this.editor = editor;
	}

	public void update(Observable obs, Object obj) {
		// ModelImpl model = (ModelImpl) obs;
		editor.clear();
	}

	public void setQuellcode(Object object) {

	}

	public void update() {
		update(null, null);
	}
}

class EditorPanel extends JPanel {
	JPanel info;
	JTextArea textArea = new JTextArea();

	public EditorPanel() {
		setLayout(new BorderLayout());

		info = new JPanel();
		info.add(new JLabel("ich bin info"));
		info.add(new JLabel("ich bin info 2"));
		
	}

	public void clear() {
		EventQueue.invokeLater(new Runnable() {
			@Override
			public void run() {
				EditorPanel.this.removeAll();
				EditorPanel.this.setLayout(new FlowLayout(FlowLayout.CENTER));
				EditorPanel.this.add(info);
				EditorPanel.this.validate();
				EditorPanel.this.repaint();
			}
		});

	}

	public void setInhalt(final String quellcode) {
		textArea.setText(quellcode);
        if (quellcode == null) {
            this.clear();
        } else {
            final JComponent th1s = this;
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    th1s.removeAll();
                    setLayout(new BorderLayout());
                    th1s.add(new JScrollPane(textArea), BorderLayout.CENTER);
                    th1s.validate();
                    th1s.repaint();
                }
            });
        }

	}

}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Q JList Update Problem AWT, Swing, JavaFX & SWT 1
D Swing JTable Problem bei automatischem update von Zellen AWT, Swing, JavaFX & SWT 3
C JTreeTable update Problem AWT, Swing, JavaFX & SWT 4
G Problem mit JLabel Update AWT, Swing, JavaFX & SWT 3
A problem mit update nach event, JSplitpane spinnt AWT, Swing, JavaFX & SWT 2
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
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
T GUI Update /EDT AWT, Swing, JavaFX & SWT 7
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
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
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
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
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
C [JTable] Update der Datenbank AWT, Swing, JavaFX & SWT 6
N update()-Methode für Canvas AWT, Swing, JavaFX & SWT 9
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
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
Juelin Problem mit TextField.requestFocus(); AWT, Swing, JavaFX & SWT 17
Juelin Problem beim Laden Controller AWT, Swing, JavaFX & SWT 2
G Problem mit der Anzeige von jLabel. Unlesbar wenn der Text geändert wird. AWT, Swing, JavaFX & SWT 28
H 2D-Grafik Problem mit Paint AWT, Swing, JavaFX & SWT 1
S Layout - Problem AWT, Swing, JavaFX & SWT 1
Tassos JavaFX/Problem mit der Maussteuerung in Stackpane AWT, Swing, JavaFX & SWT 7
sserio Java Fx - Problem AWT, Swing, JavaFX & SWT 3
A Problem Spiel auf Panel der GUI zu bringen AWT, Swing, JavaFX & SWT 1
A JavaFX Controller Problem AWT, Swing, JavaFX & SWT 1
TheWhiteShadow JavaFX ListView Problem beim Entfernen von Elementen AWT, Swing, JavaFX & SWT 1
E LayoutManager Welcher Layout-Mix löst mein Problem? AWT, Swing, JavaFX & SWT 3
Umb3rus JavaFX Problem mit PropertyValueFactory: can not read from unreadable property AWT, Swing, JavaFX & SWT 1
T Problem mit paintComponent() AWT, Swing, JavaFX & SWT 17
AmsananKING Java Menü-Problem AWT, Swing, JavaFX & SWT 1
K JavaFX Resizing-Problem beim BorderLayout (Center Component) beim Arbeiten mit mehreren FXMLs AWT, Swing, JavaFX & SWT 2
G Instance OF Problem AWT, Swing, JavaFX & SWT 9
FrittenFritze Ein Problem mit der CSSBox, die Größe wird nicht angepasst AWT, Swing, JavaFX & SWT 5
M Problem mit dem Anzeigen von Frames im Vordergrund AWT, Swing, JavaFX & SWT 5
Badebay Problem mit JButton AWT, Swing, JavaFX & SWT 2
newJavaGeek Grid-Layout problem AWT, Swing, JavaFX & SWT 7
J JavaFX Löschen im Tabelview macht Problem AWT, Swing, JavaFX & SWT 15
JavaTalksToMe JavaFx ExekutorService Problem AWT, Swing, JavaFX & SWT 2
Zrebna Problem bei Eventhandling (Value soll nach jedem erneutem Klick gelöscht werden) AWT, Swing, JavaFX & SWT 4
B Problem mit JavaFX AWT, Swing, JavaFX & SWT 5
J css Problem AWT, Swing, JavaFX & SWT 5
B JavaFX habe mein Problem fett markiert AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben