Wie kann ich einen eventhandler von einem button array machen?

2 Antworten

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

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

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

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

0
@gut4fr5g4

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

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

0
@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
@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
@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

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

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

0
@4sdfxD

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

0

Getter und setter richtig verstanden & vererbung erklären?

Mir ist gerade erst in einem Tutorial auf YouTube nebenbei (es gibt garnicht darum) glaube ich klar geworden, was ein getter und setter bringt, nicht das ich jetzt falsch lerne, frage ich lieber noch einmal nach.

So wie ich es verstanden habe ist ein setter so aufgebaut:

int x = 10; public void setter(int x){ this.x = x }

Er erwartet also einen Wert und gibt einer oberen Variable (die, die man verändern will) den mitgegebenen wert.

Der getter:

int x = 10; public void getter(){ return x; }

Er gibt die oben stehende Variable zurück und kann mithilfe von instanzen aus anderen klassen abgerufen werden

Habe ich das so richtig verstanden, oder ist irgendetwas falsch?

Außerdem noch:

Kann mir nocheinmal jemand an einem beispiel bitte ausführlich vererbung erklären (habe dies schon öfters gefragt, aber nie richtig verstanden, deshalb wäre echt nett, wenn ihr euch auf einen neuen versuch einlasst :D)

LG und schönen Abend noch! ;)

...zur Frage

Java: JButton mit MouseListener. Wie Button ansprechen?

 Maps[i] ist hierbei ein Array aus mehreren Buttons.

Maps[0].addMouseListener(new MouseAdapter() {
  public void mouseEntered(MouseEvent evt)
  {
    Maps[0].setBackground(hovering);
  }
  public void mouseExited(MouseEvent evt) 
  {
    Maps[0].setBackground(mappanel.getBackground());
}});

Wie kann ich unter mouseEntered den genauen Button abfragen, über welchem der Mauszeiger hovert? Momentan muss ich immer genau einen Button nennen und möchte das nun flexibler gestalten.

...zur Frage

JavaFX mit Gridpane 2 Hbox in das selbe Kästchen?

Hi!

Wie kann ich dafür sorgen, dass wenn ich in ein Kästchen einer Javefx Gridpane 2 Hboxen tue, dass deren beider Komponenten noch für Events empfänglich sind. Hier ein Beispiel, dass NICHT funktioniert:

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.stage.Stage;

public class Test extends Application {

public static void main(String[] args) {
    launch(args);
}
@Override
public void start(Stage primaryStage) {
    primaryStage.setTitle("Test");
    Button btn1 = new Button();
    btn1.setText("Knopf 1");
    btn1.setOnAction(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent event) {
            System.out.println("1. Knopf");
        }
    });
    Button btn2 = new Button();
    btn2.setText("Knopf 2");
    btn2.setOnAction(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent event) {
            System.out.println("2. Knopf");
        }   
    });
    HBox b1 = new HBox();
    b1.setAlignment(Pos.BASELINE_LEFT);
    b1.getChildren().add(btn1);
    
    HBox b2 = new HBox();
    b2.setAlignment(Pos.BASELINE_RIGHT);
    b2.getChildren().add(btn2);
    
    GridPane root = new GridPane();
    root.setGridLinesVisible(true);
    root.add(b2, 0, 0);
    root.add(b1, 0, 0);
    root.add(new Label("______________SPACER______________"), 0, 1);
    primaryStage.setScene(new Scene(root, 300, 250));
    primaryStage.show();
  }
}

Der 2. Knopf steht zwar am Anfang im Fokus, lässt sich aber nicht drücken/ mit Enter betätigen. Er lässt sich auch nach drücken des 1. Knopfs nicht wieder in den Fokus bringen. Wie kann ich das Lösen, OHNE beide in eine box zu bringen?

Danke für alle hilfreichen Antworten. __________________________________________________________________

Ich will NICHT sowas wie "Du köntest die knöpfe doch einfach in verschiedene Kästchen selzen." hören. Das ist nur ein BEISPIEL, bei meinem Code, für den ich das brauche, ist das vonnöten.

...zur Frage

Java: Methodenaufruf in einem Object-Array?

Guten Tag,

ich habe ein Spielfeld, welches durch ein Object-Array dargestellt wird. Der Spieler wird durch ein P dargestellt und hat am Anfang die Positionen x und y, welche ich beim Einlesen mit BufferedReader bestimmt habe.

Beispielcode:

abstract class Area {
    public boolean canMove();
}



class A extends Area {
    public boolean canMove() {...}
}



class B extends Area implements InterF {
    public boolean canMove() {...}
    public void trigger() {...}
}



interface InterF {
    public void trigger();
}


class Map {
    Area[][] area;
    ... 
    private void build {
         for (int y = 0; y < area.length; y++){
            for (int x = 0; x < area[y].length; x++) {
                 switch (area[y][x]) {
                    case A: 
                        area[y][x] = new A(); 
                        break;
                    case B: 
                        area[y][x] = new B(); 
                        break;
            }
        }
}

Wenn ich jetzt meinen Spieler in dem Array bewege, wie kann ich wissen, welches Object sich in dem Array-Feld [y][x] befindet (A oder B) und wie kann ich dann die Methode canMove() ausführen und ggf trigger() aus B?

...zur Frage

Java Array einlesen.

Hallo ich fange neu mit Java an und habe folgendes Problem:

Ich möchte einen Array von 15 er Länge einlesen und hab volgendes bereits geschrieben :


import java.util.Scanner;

public class Aufgabe2 {

public static Scanner in;

public static void main (String[] args) { int a[] = new int[15];

/* Einlesen eines 15'er Array's */

for (int i = 0; i < 15; i++){ a[i] = in.nextInt(); }

/* Ausgabe */

for (int i = 0; i < 15; i++){ System.out.printf("%d", a[i]); }

} }


Nun bekomme ich aber immer folgeden Fehlermeldung:

Exception in thread "main" java.lang.NullPointerException

woran liegt das was hab ich falsch gemacht?

Danke schonmal für eure Hilfe.

GLG Ede

...zur Frage

Was möchtest Du wissen?