Frage von 4sdfxD, 337

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

Antwort
von Momischmiddi, 83

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

Kommentar von gut4fr5g4 ,

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 :)

Kommentar von gut4fr5g4 ,

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

Kommentar von Momischmiddi ,

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! )




Kommentar von Momischmiddi ,

//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

Kommentar von Momischmiddi ,

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.

Kommentar von gut4fr5g4 ,

Thx m8

Kommentar von gut4fr5g4 ,

und woher weiß ich, der wie vielte button das aus dem array ist?

Kommentar von gut4fr5g4 ,

achja ich krieg ne fehlermeldung: "multiple markers at this line 

-the method addActionListener(Klasse) is undefindes ffor the type Button

Kommentar von Momischmiddi ,

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.

Kommentar von gut4fr5g4 ,

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

Kommentar von Momischmiddi ,

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

Antwort
von spriday, 142

Darf ich vorher erstmal fragen, warum du 1944 buttons brauchst?

Kommentar von 4sdfxD ,

ich programmiere minesweeper und mache da jedes feld (habe halt 1944) als button

Kommentar von 4sdfxD ,

also pls antwort auf die frage :D

Kommentar von spriday ,

Du könntest ein externes Programm programmieren und dann mit einer for-Schleife den Code in eine Textdatei schreiben.

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten