Java Swing: Wie kann ich Klicks auf Buttons zählen?
Hallo zusammen,
folgendes Programm habe ich. Nun möchte ich dieses noch optimieren. Es soll nun neben dem Button angezeigt werden, wie oft der Button geklickt wurde. Kann mir hier jemand helfen?
Vielen Dank!
import javax.swing.*;
import java.awt.*;
// Event brauchen wir für das Ereignis, wenn ein Button geklickt wird
import java.awt.event.*;
public class FirstGUI extends JFrame {
private JButton button1;
private JButton button2;
private JButton button3;
private JPanel panelButton;
private JLabel oben;
private JLabel anzeige;
public FirstGUI() {
super("Fenster");
setLocation(300, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Das BorderLayout ist mal das erste - später fügen wir noch ein GridLayout im Westen hinzu
getContentPane().setLayout(new BorderLayout(5, 5));
// Buttons erzeugen
button1 = new JButton("Button 1");
button2 = new JButton("Button 2");
button3 = new JButton("Button 3");
// Panels erzeugen auf einem GridLayout
panelButton = new JPanel(new GridLayout(3, 1));
// Auf Panel Buttons packen
panelButton.add(button1);
panelButton.add(button2);
panelButton.add(button3);
// Listener für Buttons
addButtonListener(button1);
addButtonListener(button2);
addButtonListener(button3);
// Labels erzeugen
oben = new JLabel("Layout Test");
// Label zentrieren
oben.setHorizontalAlignment(JLabel.CENTER);
anzeige = new JLabel("Button klicken");
// Labels auf Frame packen (direkt auf das BorderLayout)
getContentPane().add(BorderLayout.NORTH, oben);
getContentPane().add(anzeige);
// Panels auf Frame packen (das panelButton hat ein GridLayout, dass jetzt in den WestBereich des BorderLayouts kommt)
getContentPane().add(BorderLayout.WEST, panelButton);
pack();
setVisible(true);
}
public static void main(String[] args) {
FirstGUI g = new FirstGUI();
}
private void addButtonListener(JButton b) {
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
eingabe(ae.getActionCommand());
}
});
}
private void eingabe(String a) {
anzeige.setText(a);
}
}
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.
Du hast nichts von dem umgesetzt, was ich in meiner Antwort schrieb. Daher kann es auch nicht funktionieren.
Vielen Dank! Leider funktioniert es bei mir nicht...kannst du das in meinen Quellcode eingeben?
Zu 3.) Wenn ich das richtig verstehe wird dann nur ein ActionListener erstellt und nicht wie im Code des Fragestellers einer pro Button?
Ja, habe ich nur nicht deutlich genug geschrieben. Ein ActionListener reicht aus.
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.
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.
Ach, in meinem Code fehlt noch etwas:
public FirstGUI(){
button1 = new MyButton(new JButton("Button1"));
...
panelButton.add(button1.button);
...
}
Hallo,
hier mein quellcode
https://pastebin.com/fYH54QY4