Hier 3 Beispiele, wie man es machen kann:
PS:
Lass dich von dem etwas komplizierteren Code in der main-Methode nicht stören ;-)
1. Als anonyme Klasse:
Hier wird eine anonyme Klasse erstellt, in der die Ereignisbehandlung erfolgt. Bei aufwändiger Ereignisbehandlung nicht so empfehlenswert. Bei ganz kleinen Aufgaben, wie einem exit-JButton kann dies jedoch durchaus sinnvoll sein. (Bietet sich z.B. für den windowlistener sehr gut an).
[Java]
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class AnonymousClass extends JFrame {
Container c;
JButton button;
protected AnonymousClass(){
c = getContentPane();
c.setLayout(new FlowLayout());
button = new JButton("Exit");
button.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
System.exit(0);
}
});
c.add(button);
setSize(500, 400);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run(){
new AnonymousClass();
}
});
}
}
[/Java]
2. Innerhalb einer Klasse, die das Interface ActionListener implementiert.
Bei einfacherem Aufbau der Ereignisbehandlung sicher eine gute Wahl. Wenn man nicht viel zu Behandeln hat, dann ist dies sicher empfehlenswert. Die Behandlung ist nämlich nicht direkt in dem "gui-Code" drin, aber trotzdem noch innerhalb der gleichen Klasse.
[Java]
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class InsideClass extends JFrame implements ActionListener {
Container c;
JButton button;
protected InsideClass(){
c = getContentPane();
c.setLayout(new FlowLayout());
button = new JButton("Exit");
button.addActionListener(this);
c.add(button);
setSize(500, 400);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
@Override
public void actionPerformed(ActionEvent e){
System.exit(0);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run(){
new InsideClass();
}
});
}
}
[/Java]
3. Ereignisbehandlung in einer anderen Klasse, oder sogar in einem zweiten file
Diese Möglichkeit ist dann sinnvoll, wenn die Ereignisbehandlung sehr aufwändig ist. Sie macht deswegen Sinn, weil der gui-Code von der Ereignisbehandlung getrennt wird. Dadurch wird der Code einiges übersichtlicher.
In diesem Beispiel liegen die beiden Klassen in zwei separaten files:
Die GUI-Klasse:
[Java]
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class OutsideClass extends JFrame {
Container c;
JButton button;
protected OutsideClass(){
c = getContentPane();
c.setLayout(new FlowLayout());
button = new JButton("Exit");
button.addActionListener(new OutsideClassEventListener());
c.add(button);
setSize(500, 400);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run(){
new OutsideClass();
}
});
}
}
[/Java]
Die Ereignisbehandlungsklasse:
[Java]
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class OutsideClassEventListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
}
[/Java]
Hoffe, dass dir die Beispiele etwas aufzeigen, wie die verschiedenen Methoden funktionieren und eingesetzt werden können.