ActionListener

Για τη δημιουργία ενός event object χρησιμοποιούμε διεπαφές και κλάσεις που προσφέρει η java.

Μία από τις διεπαφές είναι η ActionListener.

Η διεπαφή ActionListener

Στο παρακάτω παράδειγμα, αφού δημιουργήσουμε το παράθυρο και το κουμπί, δημιουργούμε ένα event object και το προσθέτουμε στο κουμπί.

Όταν κάνουμε κλικ στο κουμπί θα κληθεί η υλοποιημένη συνάρτηση actionPerformed και θα εκτελεστούν οι εντολές που περιέχει.

Στο απλό παράδειγμα θα εκτελεστεί η εντολή:

JOptionPane.showMessageDialog(null, "a message");
η οποία θα εμφανίσει ένα μήνυμα.

import java.awt.event.*;
import javax.swing.*;

public class EventApp {
    public static void  main(String[] args) {
        MyFrame frame= new MyFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

class MyFrame extends JFrame {
    public MyFrame() {
        setTitle("Event Frame");
        setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
        setLayout(null);
        
        //δημιουργία και τοποθέτηση κουμπιού
        JButton button = new JButton("click me");
        button.setBounds(0,0, 125, 25);
        add(button);
        
        //δημιουργεί ένα listener object
        MyListener buttonListener = new MyListener();
        
        //προσθέτει το listener object στο κουμπί
        button.addActionListener(buttonListener);
    }
    private static final int DEFAULT_WIDTH = 300;
    private static final int DEFAULT_HEIGHT = 200;
}

//implements an interface
class MyListener implements ActionListener {
    //αυτή η μέθοδος καλείται κάθε φορά που κάνουμε κλικ στο κουμπί
    public void actionPerformed(ActionEvent event) {
        //οι εντολές που εκτελούνται
        JOptionPane.showMessageDialog(null, "a message");
    }
}

Στο παρακάτω παράδειγμα όταν καλείται η υλοποιημένη διεπαφή στέλνεται στον κατασκευαστή ως όρισμα το γονικό παράθυρο. Έτσι υπάρχει πρόσβαση στα στοιχεία του παραθύρου μέσα από την υλοποιημένη διεπαφή.

import java.awt.Color;
import java.awt.event.*;
import javax.swing.*;

public class App {
    public static void  main(String[] args) {
        MyFrame frame= new MyFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

class MyFrame extends JFrame {
    private static final int DEFAULT_WIDTH = 300;
    private static final int DEFAULT_HEIGHT = 200;
    
    JTextField myText;
    JButton button;
    
    public MyFrame() {
        setTitle("Event Frame");
        setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
        setLayout(null);
        
        //Δημιουργία αντικειμένου
        myText=new JTextField();
        
        //ορισμός χαρακτηριστικών
        myText.setBounds(0, 0, 125, 25);
        myText.setBackground(Color.LIGHT_GRAY);
        //πρόσθεση αντικειμένου στο παράθυρο με την εντολή add.
        add(myText); 
        
        //δημιουργία και τοποθέτηση κουμπιού
        button = new JButton("click me");
        button.setBounds(126,0, 125, 25);
        add(button);
        
        //δημιουργεί ένα listener object με this
        MyListener buttonListener = new MyListener(this);
        
        //προσθέτει το listener object στο κουμπί
        button.addActionListener(buttonListener);
    }
}

//implements an interface
class MyListener implements ActionListener {

    MyFrame frame;
    MyListener(MyFrame obj){  
        this.frame = obj;  
    }
    
    //αυτή η μέθοδος καλείται κάθε φορά που κάνουμε κλικ στο κουμπί
    public void actionPerformed(ActionEvent event) {
        frame.myText.setText("welcome");  
    }
}

Εσωτερικές κλάσεις

Μια event διεπαφή (όπως η ActionListener) ή κλάση μπορεί να προστεθεί ως εσωτερική κλάση. Έτσι, έχει άμεση πρόσβαση στα στοιχεία του παραθύρου. Δείτε το παρακάτω παράδειγμα.

import java.awt.event.*;
import javax.swing.*;

public class EventAppInner {
    public static void main(String[] args) {
        AppFrame frame = new AppFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);   
    }
}

class AppFrame extends JFrame {
    JTextField t1, t2;
    AppFrame() {
        setLayout(null);
        setSize(400, 300);

        //add a button
        JButton button = new JButton("click me");
        button.setBounds(125, 10, 120, 25);

        //add a TextField
        t1= new JTextField();
        t1.setBounds(0,10, 120, 25);

        //add another TextField
        t2= new JTextField();
        t2.setBounds(250,10, 120, 25);

        add(t1);  
        add(t2);
        add(button);

        //create a listener
        ButtonListener bl = new ButtonListener();

        //add a listener to the button
        button.addActionListener(bl);      
    }
    
    //class inserted as inner class
    private class ButtonListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            t2.setText(t1.getText()); //copies text from t1 to t2
        }
    }  
}

Ανώνυμη κλάση

Μια event διεπαφή (όπως η ActionListener) ή κλάση μπορεί να προστεθεί ως ανώνυμη κλάση κατευθείαν επάνω στο κουμπί. Δείτε το παρακάτω παράδειγμα.

import java.awt.event.*;
import javax.swing.*;

public class EventAppAnonym {
    public static void  main(String[] args) {
        EventAppAnonymFrame frame= new EventAppAnonymFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

class EventAppAnonymFrame extends JFrame {
    public EventAppAnonymFrame() {
        setTitle("My App Frame");
        setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
        setLayout(null);

        //δημιουργία και τοποθέτηση κουμπιού
        JButton button=new JButton("click here");
        button.setBounds(0,0, 125, 25);
        add(button);

        //προσθέτει το αντικείμενο στο κουμπί με ανώνυμη κλάση
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                JOptionPane.showMessageDialog(null, "OK!");
            }
        });
    }
    private static final int DEFAULT_WIDTH = 300;
    private static final int DEFAULT_HEIGHT = 200;
}

Υλοποίηση από την extended JFrame

Μια event διεπαφή (όπως η ActionListener) μπορεί να υλοποιηθεί από την ίδια κλάση που κάνει extend την JFrame. Σε αυτή την περίπτωση η υλοποίηση των μεθόδων γίνεται μέσα στην ίδια κλάση. Δείτε το παρακάτω παράδειγμα.

import java.awt.event.*;
import javax.swing.*;

public class EventApp {
    public static void  main(String[] args) {
        MyFrame frame= new MyFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

//extension and implementation
class MyFrame extends JFrame implements ActionListener {
    public MyFrame() {
        setTitle("myFrame");
        setSize(300, 200);
        setLayout(null);

        //create dimension and add a button
        JButton button=new JButton("click here");
        button.setBounds(0,0, 125, 25);
        add(button);

        //προσθέτει το αντικείμενο listener στο κουμπί με το this
        button.addActionListener(this);
    }

    //υλοποίηση μέσα στην myFrame η οποία κάνει και το extend στην JFrame
    public void actionPerformed(ActionEvent e) {
        //actions to be performed
        JOptionPane.showMessageDialog(null, "a message");
    }
}

Όλα σε ένα (extension και implementation από την main class)

Στο παρακάτω παράδειγμα τόσο η επέκταση όσο και η υλοποίηση γίνονται από την main class που στο παράδειγμα είναι η EventAppAll.

import java.awt.event.*;
import javax.swing.*;

//implements an interface too
public class EventAppAll extends JFrame implements ActionListener {
    public static void  main(String[] args) {
        EventAppAll frame= new EventAppAll();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    public EventAppAll() {
        setTitle("myFrame");
        setSize(300, 200);
        setLayout(null);

        //δημιουργία και τοποθέτηση κουμπιού
        JButton button=new JButton("click here");
        button.setBounds(0, 0, 125, 25);
        add(button);

        //προσθέτει το αντικείμενο listener στο κουμπί με το this
        button.addActionListener(this);
    }

    //υλοποίηση μέσα στην EventApp η οποία κάνει και το extend στην JFrame
    public void actionPerformed(ActionEvent e) {
        //οι εντολές που εκτελούνται
        JOptionPane.showMessageDialog(null, "a message");
    }
}