Zum neuzeichnen wirklich zwingen

  • Themenstarter Themenstarter lumpeh
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
L

lumpeh

Gast
hio
ich habe folgendes Problem
Ich habe eine Suche auf einer Datenbasis implementiert und möchte, wenn der User auf "suche "klickt, der Suchen button für die Dauer der suche inaktiv wird.
Meine Suche wird in einem anderen Thread durchgeführt.
Nun habe ich folgendes (vereinfacht) geschrieben:

.
.
.

(in meinem Extra SearchThread)
MainThread.Button.setEnabled(false);
suche();
MainThread.Button.setEnabled(true);


.
.


nun sucht er und wenn die Suche fertig ist, setzt er den Button auf disabled und direkt wieder enabled..

irgendwie muss ich es erzwingen, dass er sofort neuzeichnet? Mit validate und repaint funktioniert es nicht..

jemand ne idee?
 
Code:
public class GUI extends JFrame {

	public GUI() {

		final JButton b = new JButton("Button");
		b.setBackground(Color.GREEN);
		b.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				b.setEnabled(false);
				b.setBackground(Color.RED);
				new Thread(new Runnable() {

					public void run() {
						try {
							Thread.sleep(3000);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
						b.setEnabled(true);
						b.setBackground(Color.GREEN);
					}
				}).start();
			}

		});

		getContentPane().add(b);
		setSize(400, 400);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
	}

	public static void main(String[] args) {
		new GUI();
	}
}
funktioniert doch..

bist du dir sicher mit dem separaten Thread?
rufst du auch start auf und nicht run oder solche Späße?
reagiert die GUI während der Thread läuft?
 
bin grade etwas verwirrt

also meine Suche Klasse "extends thread"

und wenn ich dann im Mainthread Suche suche = new Suche() mache, dann erstellt er nen neuen thread oder?
habe zwar "run" überschrieben, aber die methode brauche ich garnicht, da ich die suche über spezielle Methioden (sucheArtist, suche Titel usw) realisiert habe.
ich mache das dann so:

Suche suche = new Suche() ;
ergebnis = suche.sucheTitel();
 
so benutzt du das Thread-Objekt als ganz normales Objekt,
die Arbeit wird also vom AWT-Thread gemacht, die GUI solange blockiert

du musst dich schon an die genauen Anweisungen halten, um einen Thread zu verwenden,
siehe mein Beispiel oder ein Lehrbuch deiner Wahl

- run() implementieren
- start() aufrufen
 
jo das hab ich irgendwie falsch verstanden 😉

werde das jetzt mal umändern, dass es in einem richtigen thread läuft
danke für die hilfe 🙂
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben