# Buttons anklickbar machen, bzw. Threadproblem



## Guest (30. Dez 2007)

Hallo,

ich schreibe gerade an einem Bildbearbeitungsprogramm und habe folgendes Problem:

Meine Oberfläche, die aufgerufen wird, zeigt jeweils ein Bild an und dazu etwa 10 Buttons mit verschiedenen Funktionen (graumachen, heller, etc.) 
Viele dieser Funktionen habe ich mit Threads realisiert, da ich wollte, dass der Prozess stufenweise abläuft, dh. die Pixel nacheinander verändert werden und nicht alle auf einmal.

Nun habe ich das Problem, dass die Funktionen zwar funktionieren, ich aber das Bild völlig durcheinander bringe, wenn ich mehrere Buttons schnell hintereinander klicke. (Es bekommt dann Streifen, sieht ab der Mitte anders aus, oder ähnliches)

Für die Funktionen, die mit Threads arbeiten, habe ich immer jeweils eine Klasse geschrieben und dort Runnable implementiert, dh. es nützt mir ja auch nichts, wenn ich die Methoden synchronized mache, da sie ja immer in verschiedenen Klassen sind..

Nun habe ich mir überlegt, dass ich für den Zeitraum, in dem ein Button angeklickt wurde, evtl. die anderen Buttons eben "nicht-anklickbar" mache, dh. dass ein Klick keine Wirkung zeigt, solange nicht die vorherige Funktion ausgeführt wurde

Wie geht sowas?

Und hat evtl. jemand eine andere Idee?

Vielen Dank!


----------



## dieta (30. Dez 2007)

Das kannst du mit JButton.setEnabled(false) machen.
Das kannst du z.B. über einen Listener lösen, den du allen Runnable-Klassen übergibst.


----------



## farmer (30. Dez 2007)

Hi!

Du kannst Button und alle anderen Components mit der Methode

"public void setEnabled(boolean b)"

ein und ausschalten. Das müsstest du halt nur mit allen Buttons machen, die du hast...vielleicht wäre ein anderer Ansatz weniger aufwendig...

EDIT: Da ist mir wohl jemand zuvorgekommen.... :roll:


----------



## SlaterB (30. Dez 2007)

button.setEnabled(false)

oder intern das Bild sperren und bei Button-Klick ein Hinweis-Fenster anzeigen oder beliebiges,
was genau ist da deine Frage?


----------



## Guest (30. Dez 2007)

Hallo,

also setEnabed klingt ja sehr logisch (dass ich da nicht selber drauf gekommen bin..)

Wie genau meinst du das hier?

>>>Das kannst du z.B. über einen Listener lösen, den du allen Runnable-Klassen übergibst.

habe ja einmal eine Klasse ButtonHandler mit ActionListener, dort wird dann angeben, was beim jeweiligen Buttonklick passiert, also zB auch die Runnable-klassen aufgerufen

ich hätte sonst einfach noch eine Methode geschrieben, die alle Buttons auf setEnabled(false) setzt, die mit Threads in verbindung stehen und diese Methode beim aufruf eines Buttons (der mit Threads arbeitet - oder evtl besser bei allen?) aufgerufen 

danke!


----------



## Guest (3. Jan 2008)

Hilfe - es hat sich eine neue Frage aufgetan:

Das mit den Buttons hat sehr gut geklappt gehabt, allerdings wurden es mir nun zu viele Buttons, so dass ich auf eine combobox gewechselt habe - 
wie mache ich das jetzt, wenn ich in der combobox eine Aktion auswähle, die einen Thread einer Klasse aufruft, dass ich in der Zeit, wo dieser läuft, ich keine anderen aufrufen kann!?

habe in meiner ganzen Oberklasse nur einen Thread thread; definiert, diverse Unterklassen mit Runnable implementiert, die dann aufgerufen habe

wie verhinder ich, dass die gleichzeitig gestartet werden könne?!

Einträge in der combobox inaktiv machen, geht sowas? 
Oder wie mache ich das mit den Threads?

Danke!


----------

