Wie kann ich einen eventhandler von einem button array machen?

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

gut4fr5g4  14.08.2016, 19:17

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

0
gut4fr5g4  14.08.2016, 19:18
@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

0
Momischmiddi  14.08.2016, 19:34
@gut4fr5g4

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




0
Momischmiddi  14.08.2016, 19:38
@gut4fr5g4

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

0
Momischmiddi  14.08.2016, 19:40
@gut4fr5g4

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.

1
gut4fr5g4  14.08.2016, 21:13
@gut4fr5g4

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

0
gut4fr5g4  14.08.2016, 21:20
@gut4fr5g4

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

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

0
Momischmiddi  15.08.2016, 03:57
@gut4fr5g4

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.

0
gut4fr5g4  15.08.2016, 10:33
@Momischmiddi

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

0
Momischmiddi  15.08.2016, 16:06
@gut4fr5g4

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

1