Java Swing: Wie kann ich Klicks auf Buttons zählen?

2 Antworten

Es soll nun neben dem Button angezeigt werden, wie oft der Button geklickt wurde.

Nach meiner Zählung gibt es mehr als nur einen Button. Also nehme ich einmal an, für jeden Button soll einzeln gezählt werden.

1) Erhöhe zunächst einmal die Spaltenanzahl des GridLayouts, und setze jeweils ein Label in die zweite Spalte. Jedes Label speicherst du zuvor in einem Attribut.

2) Die Buttons kannst du übrigens lokal erstellen, sie müssen nicht als Attribute gespeichert werden. Stattdessen bekommen sie jeweils einen Namen zugewiesen:

JButton button1 = new JButton("Button 1");
button1.setName("button1");

3) Des Weiteren benötigst du drei Zählerattribute. Zwar nicht zwingend, es gäbe noch einen anderen Weg (Label immer wieder neu auslesen), aber den hielte ich nicht für so gut.

4) In der actionPerformed-Methode kannst du folgend erfragen, welcher Button angeklickt wurde.

String name = ((Component)ae.getSource()).getName();

Je Name zählst du den Counter um 1 nach oben und setzt den Wert des entsprechenden Labels.

label1.setText(counterForButton1);

5) Starte dein Programm im Dispatch Event Thread. Lies dazu hier.

// main:
SwingUtilities.invokeLater(() -> new FirstGUI());

Zuletzt noch Anmerkungen zu deinem bisherigen Code:

  • Entscheide dich bei der Benennung von Bezeichnern für eine Sprache und halte diese eindeutig, ausdrucksstark.
  • Verwende nicht diese Signatur zum Hinzufügen von Komponenten:
getContentPane().add(BorderLayout.WEST, panelButton);

Drehe die Reihenfolge der Argumente um. So wie auch hier (unter dem Bild) gezeigt.


Destranix  23.03.2019, 16:42

Zu 3.) Wenn ich das richtig verstehe wird dann nur ein ActionListener erstellt und nicht wie im Code des Fragestellers einer pro Button?

0
regex9  23.03.2019, 16:54
@Destranix

Ja, habe ich nur nicht deutlich genug geschrieben. Ein ActionListener reicht aus.

1
Sunshine2019 
Fragesteller
 23.03.2019, 16:53

Vielen Dank! Leider funktioniert es bei mir nicht...kannst du das in meinen Quellcode eingeben?

0
Sunshine2019 
Fragesteller
 23.03.2019, 17:15

ja genau das ist der ursprüngliche quellcode

0

Ich kenn mich zwar mit AWT wenig aus, aber ich glaube, wnen du für jeden Button einen Counter erstellst, im zugehörigen ActionListener diesen erhöhst und eine Anzeige für die Counter erstellst, dann sollte es gehen.


Sunshine2019 
Fragesteller
 23.03.2019, 16:23

kannst du mir zeigen wie das genau geht?

0
Destranix  23.03.2019, 16:34
@Sunshine2019

Ich würde das jetzt ausgehend von deinem Code folgendermaßen machen:

...

private class MyButton{
  final JButton button;
  int counter;

  public MyButton(JButton button){
    this.button = button;
  }

  public void incCounter(){
    counter++;
  }
}
private MyButton button1, button2, button3;
...
private void addButtonListener(MyButton b){

 b.button.addActionListener(new ActionListener(){

  public void actionPerformed(ActionEvent ae){

   eingabe(ae.getActionCommand());
   b.incCounter();
  }
 });

 }
...

Dann am Besten noch in die innere Klasse irgendwie ein JLabel reinbasteln, welches du dann auch in actionPerformed aktualisierst und welches du irgendwo anzeigst.

0
Destranix  23.03.2019, 16:36
@Sunshine2019

Ach, in meinem Code fehlt noch etwas:

public FirstGUI(){
  button1 = new MyButton(new JButton("Button1"));
...
panelButton.add(button1.button);
...

}
0
regex9  23.03.2019, 16:38
@Destranix

Ein Button, der einen Button hat? Nein, das ist nicht logisch.

0
Destranix  23.03.2019, 16:40
@regex9

Das soll auch nur ein Struct repräsentieren. Kann man sicher auch anders umsetzen.

0