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"); } }