Wie kann ich einen eventhandler von einem button array machen?
also ich habe einen sehr großen button array (1944 buttons)
wie kann ich EINEN eventhanlder davon machen ohne alle buttons aufzuschreiben?
mit for geht anscheinend nicht: for(int i = 0; i<1944; i++){ button[i].setOnAction(new EventHandler(){ public void handle(ActionEvent event1){
}
});
}
Danke im vorraus! :D
1 Antwort
Da du Minesweeper programmierst hier mein Vorschlag:
Für sowas keine Buttons benutzen sondern Labels und diese dann mit einem Mouselistener realisieren. Bau dir am besten eine eigene Klasse die von MouseListener erbt und geb jedem Label dann eine neue Instanz dieser Klasse, somit kannst du bei jedem klick auf dem Label die Koordiaten ( Du kannst die Labels in einem zweidimensionalem Array deklarieren und die Koordinaten im Konstruktor weiterreichen ) die Koordinaten rauslassen..
Somit musst du nicht jedes mal abfragen welcher Button geklickt worden ist. Wenn du willst kann ich dir das schnell programmieren und dir den Code hier schicken, sollten nicht mehr als 10 Zeilen sein
Viele Grüße
aber wenn ich minesweeper fertig habe kannst du es mir gerne machen (dann ist sowas erwünscht, weil ich dann ja m,ein ziel erreicht habe und dann mich gerne auf andere lösungswege einlasse)
Weißt du eine antwort auf meine frage unter perfektMuffins kommentar?
LG
Das ist ganz einfach und solltest du in Zukunft immer so machen da anonyme Klassen recht schlechter Stil sind.. Das funktioniert mit allen Listenern. Hier mein Code-Beispiel mit einem ActionListener ( Überleg dir aber gut ob du es wirklich mit Buttons machen willst! )
//Die Schleife in der du deine Buttons initialisierst
for(int i=0;i<buttons.length;i++){
button[i].addActionListener(new MeineEigeneListenerKlassse());
//Jeden deiner Buttons mit einer Instanz deiner
//EventHandler Klasse registrieren.
}
Und hier jetzt deine ListenerKlasse:
class MeineEigeneListenerKlasse implements ActionListener {
@Override // Wird automatisch eingefügt, Grund ist unwichtig.
public void actionPerformed(ActionEvent e) {
//Jetzt werden deine ActionEvents in dieser Klasse verarbeitet
//und nicht mehr in einer Anonymen
System.out.println("Ich wurde gedrückt!");
}
}
Viele Grüße
Deine Listenerklasse muss also nur von dem Listener implenetieren sei es nun
implements ActionListener
implements MouseListener
implements ComponentListener
oder was auch immer, dann wird dir in der Regel eine Warning angezeigt die du anklicken musst und dort kannst du dann automatisch die Override Methoden einfügen lassen, also die Methoden, die dein ActionListener verarbeiten kann, bei einem JButton also nur das actionPerformed event.
und woher weiß ich, der wie vielte button das aus dem array ist?
achja ich krieg ne fehlermeldung: "multiple markers at this line
-the method addActionListener(Klasse) is undefindes ffor the type Button
Du musst in deiner Listener-Klasse einfach einen Konstruktor machen, an den du immer die Koordinaten des Buttons mitgibst und diese dann einfach als Klasseneigenschaft pro Instanziierung initialisieren musst. und dann hast du ja für jeden Button eine eigene Instanz der Listener-Klasse. Wenn du willst kann ich dir das gerne vorprogrammieren und dir schicken, weil das echt blöd zum erklären ist..
aber nochmal mein Tipp, benutz lieber JLabel's anstatt JButton's, allein aus performance-Gründen, wenn du schon so viel Buttons hast frisst das echt viel Zeit.
Außerdem solltest du dich mit dem MVC-Model außeinander setzen, wenn du dich schon auf solche Spielereiener einlässt.
Wenn du nochmal ein Code-Beispiel möchtest, in Bezug auf die Koordinaten der Buttons sag bescheid! Ich versuchs auch so gut wies geht zu kommentieren
Viele Grüße.
hab jetzt:
public class ListenerKlasse implements ActionListener{
public void actionPerformed(ActionEvent event1) {
}
}
und
for(int i = 0; i<1944; i++){
button[i].addActionListener(new ListenerKlasse());
}
was muss ich jetzt zu nem konstruktor machen?
LG und danke jetzt schonmal für die, im gegensatz zu perfectmuffin, gute hilfe
Du schreibst in deiner Listenerklasse einen Konstruktor, der einen Integer erwartet und gibst dann für jede instanz die du als Listener realisierst den Wert i mit, somit weißt du dann welcher Button geklickt worden ist, so in etwa:
die Button-Schleife:
for(int i=0;i<button.length;i++){
// Hier einfach den Wert i mitgeben, damit jede Instanz weiß,
// um welchen Button es sich bei ihr handelt.
button[i].addActionListener(new ListenerKlasse(i));
}
die ListenerKlassee:
public class ListenerKlasse implements ActionListener{
private int pressedButton;
public ListenerKlasse(int buttonIndex){
pressedButton = buttonIndex;
/*
Da jeder Button eine eigene Instanz der ListenerKlasse kriegt und nicht immer mit dem selben Objekt realisiert wird, kannst du hier einfach die Klasseneigenschaft pressedButton mit dem Wert des Buttons i initialisieren.
*/
}
public void actionPerformed(ActionEvent event1) {
// Hier jetzt einfach den Wert von pressedButton ausgeben
// und damit arbeiten.
System.out.println(pressedButton);
System.out.println("Ich wurde gedrückt!");
}
Hoffe es hilft dir weiter!
Viele Grüße
ne danke ich will ja selber programmieren (ich mache das so, auch wenn es uneffektiv ist: ich programmiere ein spiel oder eine andere anwendung und sobald ich etwas nicht kann, hauptsächlich weil ich es nicht gelernt habe bis zu dem zeitpunkt und somit nicht wissen kann, frage ich hier, lerne dies usw, sodass sich mein wissen dann immer weiter ausbaut)
Aber danke für dein angebot, nur das ist nicht was ich will :)