# Equivalent zu "doEvents" unter Java?



## Haruka (8. April 2005)

Morgen!

Ich hab da mal eine kleine Frage:
Wenn man aufeinen Button klickt, der ein Label sichtbar macht und ein anderes unsichtbar, wird die Ansicht erst gewechselt, wenn actionPerformed() durchgelaufen ist.

Gibt es etwas womit man sie die Sichbarkeit der Labels (sehbar) ändern kann, bevor die Funktion beendet wurde? Unter VB (*) konnte man sowas mit doEvents machen. Hat Java irgendwas änliches in der Richtung?

Momentan hab ich dafür nur einen unschönen Workaround mit einem TimerTask

(JDK-Version: Tiger)

(*: Nein, ich kann mehr Sprachen als VB )


----------



## Christian Fein (8. April 2005)

Was machst du denn soviel in deiner actionPerformed() Methode?

Wenn hier eine ganze Menge abläuft, solltest du jenes in einen 
Thread auslagern.


----------



## Thomas Darimont (11. April 2005)

Hallo!

Wshalb rufst du setVisible(false) an dem jeweiligen JLabel nicht schon vor Beginn der langlaufenden Logik auf?

Gruß Tom


----------



## Haruka (11. April 2005)

Tom:
Doch, mach ich natürlich, aber das ignoriert er gekonnt...
Ich habs jetzt mit nem Thread gemacht wie Christian es vorgeschlagen hat.

Christian:
Ich durchparse ein Verzeichnis nach Dateien. Und jenach dem wie viele Dateien da drinne sind, kann das natürlich nen bissel dauern.


----------



## Thomas Darimont (11. April 2005)

Hallo!

Stimmt durch die langlaufende Aktion ist der EDT so lange beschäftigt, dass dieser gar nicht mehr zum veranlassen des Neuzeichnens kommt...

Dann eben in einem eigenen neuen Thread:

```
/**
 * 
 */
package de.tutorials;

import java.awt.BorderLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.concurrent.Executors;

import javax.swing.JFrame;
import javax.swing.JLabel;

/**
 * @author Tom
 */
public class JFrameExample extends JFrame {

	JLabel lblA, lblB;

	public JFrameExample() {
		super("JFrameExample");
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		lblA = new JLabel("A");
		add(lblA, BorderLayout.WEST);

		lblB = new JLabel("B");
		add(lblB, BorderLayout.EAST);

		lblA.addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent evt) {
				lblB.setVisible(false);
				Executors.defaultThreadFactory().newThread(new Runnable() {
					public void run() {
						try {
							Thread.sleep(3000L);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
						System.out.println("finish!");
					}
				}).start();
			}
		});

		pack();
		setVisible(true);

	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new JFrameExample();
	}
}
```

generell sollte man langandauernde Operationen NIE in Methoden der Ereignisbehandlung ablaufen lassen, da diese bis zu ihrer vollständigen Abarbeitung das neuzeichnen der GUI verhindern.

Gruß Tom


----------

