Benutzer-Werkzeuge

Webseiten-Werkzeuge


info10:stoff:action-listener

Action Listener (GUI)

Java 8 Syntay:

spieleButton.addActionListener(e -> spiele());

1. Graphische Komponenten wie z.B. einen JButton erzeugen

Zunächst benötigt man erst einmal eine GUI-Komponente, wie einen JButton oder ein JLabel oder eine JTextArea. Genauer gesagt benötigt man ein Objekt von JButton und integriert das in seine eigene Klasse. Wie das geht steht z.B. hier.

2. ActionListener - Eine Methode aufrufen, wenn der JButton gedrückt wird

Ein Druck auf den JButton alleine bewirkt aber noch nichts. Man benötigt einen ActionListener, der benachrichtigt wird, wenn jemand auf den JButton klickt.

Ein ActionListener ist eine spezielle Klasse, die das Interface ActionListener implementiert. Alle ActionListener haben eine actionPerformed-Methode. Die wird aufgerufen, wenn jemand auf den Button klickt.

Die Theorie zu ActionListener kannst Du entweder den Beispielen 1-3 entnehmen oder sehr ausführlich hier nachlesen:

Beispiel 1 - EinfacheGUI

Dieses Beispiel besteht aus einem JFrame (also ein Fenster) und einerm JButton. Der Button ist beschriftet mit „klick mich“. Wenn man draufklickt wird die actionPerformed-Methode des ActionListeners aufgerufen. Die actionPerformed-Methode ändert den Text des Buttons auf „Ich wurde geklickt“. Wichtig hier: Die Hauptklasse selbst (this) wird hier zum ActionListener. Dem Button wird dann die Hauptklasse als ActionListener mit dem Befehl button.addActionLIstener(this) hinzugefügt. Solange man nur einen JButton hat funktioniert das.

EinfacheGui.java
import java.awt.event.*;
import javax.swing.*;
 
public class EinfacheGui implements ActionListener {
    private JButton button;
    private JFrame frame;
 
    public static void main(String[] args) {
        EinfacheGui gui = new EinfacheGui();
        gui.los();
    }
 
    public void los() {
        frame = new JFrame();
        button = new JButton("klick mich");
 
        button.addActionListener(this);
 
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(button);
        frame.setSize(300, 300);
        frame.setVisible(true);
    }
 
    public void actionPerformed(ActionEvent event) {
        button.setText("Ich wurde geklickt!");
    }
}

Beispiel 2 - Einfaches Fenster mit einem JButton und einem JLabel

Die Klasse MeinFrame besteht aus einem JButton und einem JLabel. Im JLabel werden die Anzahl der Klicks auf den JButton ausgegeben. Jedesmal wenn man auf den Button klickt, wird die ActionPerformed Methode aufgerufen. Diese erhöht den Zähler klicks und aktualisiert das Label dann.

Neu ist hier, dass nicht die Hauptklasse (MeinFrame) selbst zum ActionListener wird, sondern es wird stattdessen eine innere Klasse buttonListener erzeugt, der zum ActionListener wird.

MeinFrame.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
 
public class MeinFrame extends JFrame{
 
    private JLabel jlabel;
    private JButton jButton;
    private int klicks;
 
    public MeinFrame() {
        setTitle("TestFrame");
 
        jlabel = new JLabel("Klicks: " + klicks);
        jButton = new JButton("Drück mich");
 
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
        getContentPane().add(jlabel, BorderLayout.LINE_START);
        getContentPane().add(jButton, BorderLayout.PAGE_END);
 
        jButton.addActionListener(new buttonListener());
 
        pack();
        setVisible(true);
    }
 
    class buttonListener implements ActionListener{
        public void actionPerformed(ActionEvent e){
            klicks++;
            jlabel.setText("Klicks: " + klicks);
        }
    }
 
    public static void main(String[] args){
        new MeinFrame();
    }
}

Beispiel 3 - Zwei Buttons

Wenn man zwei JButtons in einer GUI benötigt, dann benötigt man auch zwei ActionListener. Diese werden als zwei innere Klassen implementiert, da der ActionListener Zugriff auf die Attribute der Hauptklasse braucht.

ZweiButtons.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
 
public class ZweiButtons {
 
	JFrame frame;
	JLabel label;
 
	public static void main (String[] args) {
		ZweiButtons gui = new ZweiButtons ();
		gui.los();
	}
 
	public void los() {
		frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
		JButton labelButton = new JButton("Ändere Label");
		labelButton.addActionListener(new LabelListener());
 
		JButton colorButton = new JButton("Ändere Kreis");
		colorButton.addActionListener(new ColorListener());
 
		label = new JLabel("Ich bin ein Label");
		MeinZeichenPanel zeichenPanel = new MeinZeichenPanel();
 
		frame.getContentPane().add(BorderLayout.SOUTH, colorButton);
		frame.getContentPane().add(BorderLayout.CENTER, zeichenPanel);
		frame.getContentPane().add(BorderLayout.EAST, labelButton);
		frame.getContentPane().add(BorderLayout.WEST, label);
 
		frame.setSize(420,300);
		frame.setVisible(true);
	}
 
	class LabelListener implements ActionListener {
		public void actionPerformed(ActionEvent event) {
			label.setText("Autsch!");
		}
	} // innere Klasse schließen
 
	class ColorListener implements ActionListener {
		public void actionPerformed(ActionEvent event) {
			frame.repaint();
		}
	} // innere Klasse schließen
}
 
class MeinZeichenPanel extends JPanel {
      public void paintComponent(Graphics g) {
         g.fillRect(0,0,this.getWidth(), this.getHeight());
 
         // Zufallsfarben zum Ausfüllen erzeugen
         int rot = (int) (Math.random() * 255);
         int grün = (int) (Math.random() * 255);
         int blau = (int) (Math.random() * 255);
 
         Color randomColor = new Color(rot, grün, blau);
         g.setColor(randomColor);
         g.fillOval(70,70,100,100);
      }
}     
info10/stoff/action-listener.txt · Zuletzt geändert: 2023/06/16 10:35 von Ulrich Schneider