Equivalent zu "doEvents" unter Java?

Haruka

Mitglied
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 :P)
 
Was machst du denn soviel in deiner actionPerformed() Methode?

Wenn hier eine ganze Menge abläuft, solltest du jenes in einen
Thread auslagern.
 
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.
 
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:
Code:
/**
 * 
 */
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
 
Zurück