This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
swing:events [2018/03/20 16:36] gthanos [Πιάνοντας ένα event μέσω ενός Event Listener - Παράδειγμα] |
swing:events [2021/04/13 05:16] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Events και Listeners ====== | ||
| - | |||
| - | Όταν ο χρήστης πατήσει ένα πλήκτρο από το πληκτρολόγιο ή μετακινήσει το ποντίκι, | ||
| - | |||
| - | Ο **//window manager//** δημιουργεί //events// για κάθε απειροελάχιστη μεταβολή της θέσης του ποντικιού ή για το πάτημα ενός κουμπιού από το πληκτρολόγιο. Τα περισσότερα προγράμματα δεν τα ενδιαφέρει το σύνολο των //events// που παράγονται. Προκειμένου ένα πρόγραμμα να μην " | ||
| - | |||
| - | Θα πρέπει να τονίσουμε ότι υπάρχουν διαφορετικοί τύποι event για κάθε διαφορετικό τύπο αλληλεπίδρασης του χρήστης με το γραφικό περιβάλλον. Για παράδειγμα, | ||
| - | |||
| - | ===== Οι βασικοί τύποι των διαφορετικών Event ===== | ||
| - | |||
| - | Όλα τα events που μας ενδιαφέρουν κληρονομούν την κλάση **[[https:// | ||
| - | Οι κλάσεις των events βρίσκονται μέσα στο πακέτο **java.awt.event**. Οι κυριότεροι τύποι event είναι οι εξής: | ||
| - | |||
| - | * **[[https:// | ||
| - | * **[[https:// | ||
| - | * **public int getKeyCode(): | ||
| - | * **public char getKeyChar(): | ||
| - | * **[[https:// | ||
| - | - Ένα από τα τρία κουμπιά του ποντικιού (αριστερό ή δεξί ή ροδέλα) έχει πατηθεί. | ||
| - | - Ένα από τα τρία κουμπιά του ποντικιού έχει ελευθερωθεί. | ||
| - | - Ένα από τα τρία κουμπιά του ποντικιού έχει πατηθεί και ελευθερωθεί. | ||
| - | - Ο δρομέας του ποντικιού εισάγεται στην περιοχή του // | ||
| - | - Ο δρομέας του ποντικιού εξάγεται από περιοχή που συμπίπτει με το // | ||
| - | - Ο δρομέας του ποντικιού μετακινείται πάνω σε περιοχή που συμπίπτει με το // | ||
| - | - Ο δρομέας του ποντικιού μετακινείται έχοντας παράλληλα πατημένο το αριστερό πλήκτρο (σέρνει/ | ||
| - | * Οι κυριότερες μέθοδοι της κλάσης **[[https:// | ||
| - | * **public int getButton(): | ||
| - | * **public int getClickCount(): | ||
| - | * **public Point getPoint(): | ||
| - | * **public Point getLocationOnScreen(): | ||
| - | * **[[https:// | ||
| - | * **public int getWheelRotation(): | ||
| - | * **public double getPreciseWheelRotation(): | ||
| - | * **[[https:// | ||
| - | * **public int getNewState(): | ||
| - | * **public int getOldState(): | ||
| - | * **public Window getWindow(): | ||
| - | * **[[https:// | ||
| - | |||
| - | ===== Event Listeners ===== | ||
| - | |||
| - | Για τον πιάσιμο των παραπάνω τύπων events, η Java ορίζει ένα σύνολο από interfaces, τα οποία τα οποία όταν υλοποιούνται από μία κλάση και συνδυαστούν με κάποιο από τα // | ||
| - | |||
| - | Οι κυριότεροι Event Listeners είναι οι εξής: | ||
| - | * **[[https:// | ||
| - | * **void actionPerformed(ActionEvent e)**: | ||
| - | * **[[https:// | ||
| - | * **void keyTyped(KeyEvent e):** Η μέθοδος καλείται εάν πατηθεί ένα πλήκτρο ή συνδυασμός πλήκτρων που αντιστοιχεί σε εκτυπώσιμο χαρακτήρα. Δεν έχει σημασία εάν το πλήκτρο έχει ελευθερωθεί ή όχι, αρκεί να έχει σηματοδοτηθεί η παραγωγή του χαρακτήρα προς την εφαρμογή. | ||
| - | * **void keyPressed(KeyEvent e):** Η μέθοδος καλείται εάν πατηθεί οποιοδήποτε πλήκτρο. | ||
| - | * **void keyPressed(KeyEvent e):** Η μέθοδος καλείται όταν ελευθερωθεί οποιοδήποτε πλήκτρο που πατήθηκε προηγούμενα. | ||
| - | * **[[https:// | ||
| - | * **void mouseClicked(MouseEvent e):** Καλείται όταν πατηθεί ένα κουμπί του ποντικιού (πατηθεί και απελευθερωθεί) σε ένα στοιχείο (// | ||
| - | * **void mousePressed(MouseEvent e):** Καλείται όταν πατηθεί ένα κουμπί του ποντικιού πάνω σε ένα στοιχείο (// | ||
| - | * **void mouseReleased(MouseEvent e):** Καλείται όταν έχει ελευθερωθεί ένα κουμπί του ποντικιού που προηγουμένως πατήθηκε πάνω σε ένα στοιχείο (// | ||
| - | * **void mouseEntered(MouseEvent e):** Καλείται όταν το ποντίκι μπαίνει στην περιοχή ενός στοιχείου (// | ||
| - | * **void mouseExited(MouseEvent e):** Καλείται όταν το ποντίκι βγαίνει στην περιοχή ενός στοιχείου (// | ||
| - | * **[[https:// | ||
| - | * **void mouseDragged(MouseEvent e):** Καλείται όταν πατηθεί ένα κουμπί του ποντικιού πάνω σε ένα στοιχείο και στη συνέχεια συρθεί. Τα συμβάντα MOUSE_DRAGGED θα συνεχίσουν να παραδίδονται στο στοιχείο όπου σύρεται, | ||
| - | * **void mouseMoved(MouseEvent e):** Καλείται όταν ο δρομέας του ποντικιού έχει μετακινηθεί σε ένα στοιχείο, | ||
| - | * **[[https:// | ||
| - | * **void mouseWheelMoved(MouseWheelEvent e):** η οποία καλείται σε κάθε κίνηση της ροδέλας. | ||
| - | * **[[https:// | ||
| - | * **[[https:// | ||
| - | * **void focusGained(FocusEvent e):** Το στοιχείο λαμβάνει το //focus//. | ||
| - | * **void focusLost(FocusEvent e):** Το στοιχείο χάνει το //focus//. | ||
| - | |||
| - | ===== Παράδειγμα - Πιάνοντας ένα event μέσω ενός Event Listener | ||
| - | |||
| - | Παρακάτω δίνεται το παράδειγμα της κλάσης EventHandling, | ||
| - | * **ActionEvent: | ||
| - | * **KeyEvent: ** Δηλώνει ποιος χαρακτήρας πατήθηκε κάθε φορά όταν το focus είναι στο συγκεκριμένο textfield. | ||
| - | * **MouseEvent: | ||
| - | * **MouseMotionEvent: | ||
| - | Το κουμπί εμφανίζει διαφορετικά μηνύματα όταν ο δρομέας του ποντικιού βρίσκεται πάνω από αυτό, απομακρύνεται ή γίνεται //click//. | ||
| - | |||
| - | <code java EventHandling.java> | ||
| - | import java.awt.*; | ||
| - | import java.awt.event.*; | ||
| - | import javax.swing.*; | ||
| - | import javax.swing.border.*; | ||
| - | |||
| - | public class EventHandling extends JFrame { | ||
| - | JFrame frame; | ||
| - | JPanel framePanel; | ||
| - | JPanel textFieldPanel; | ||
| - | JButton button; | ||
| - | JTextField actionEventTextField; | ||
| - | JTextField keyEventTextField; | ||
| - | JTextField mouseEventTextField; | ||
| - | JTextField mouseMotionEventTextField; | ||
| - | int buttonClickedCount; | ||
| - | private static int TEXT_FIELD_SIZE = 20; | ||
| - | | ||
| - | public EventHandling() { | ||
| - | frame = new JFrame(" | ||
| - | frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); | ||
| - | | ||
| - | button = new JButton(" | ||
| - | button.setBackground(new Color(0xe9, | ||
| - | Border buttonBorder = BorderFactory.createLineBorder(new Color(0xf9, 0xf9, 0xf9), 8); | ||
| - | button.setBorder(buttonBorder); | ||
| - | | ||
| - | buttonClickedCount = 0; | ||
| - | button.addActionListener( new ActionListener() { | ||
| - | public void actionPerformed(ActionEvent e) { | ||
| - | buttonClickedCount++; | ||
| - | actionEventTextField.setText(" | ||
| - | } | ||
| - | }); | ||
| - | | ||
| - | button.addMouseListener( new MouseListener() { | ||
| - | public void mouseClicked(MouseEvent e) { | ||
| - | } | ||
| - | public void mouseEntered(MouseEvent e) { | ||
| - | button.setText(" | ||
| - | } | ||
| - | public void mouseExited(MouseEvent e) { | ||
| - | button.setText(" | ||
| - | } | ||
| - | public void mousePressed(MouseEvent e) { | ||
| - | button.setText(" | ||
| - | } | ||
| - | public void mouseReleased(MouseEvent e) { | ||
| - | button.setText(" | ||
| - | } | ||
| - | }); | ||
| - | | ||
| - | frame.addMouseListener( new MouseListener() { | ||
| - | public void mouseClicked(MouseEvent e) { | ||
| - | switch(e.getButton()) { | ||
| - | case MouseEvent.BUTTON1: | ||
| - | mouseEventTextField.setText(" | ||
| - | break; | ||
| - | case MouseEvent.BUTTON2: | ||
| - | mouseEventTextField.setText(" | ||
| - | break; | ||
| - | case MouseEvent.BUTTON3: | ||
| - | mouseEventTextField.setText(" | ||
| - | break; | ||
| - | } | ||
| - | } | ||
| - | public void mouseEntered(MouseEvent e) { | ||
| - | } | ||
| - | public void mouseExited(MouseEvent e) { | ||
| - | } | ||
| - | public void mousePressed(MouseEvent e) { | ||
| - | } | ||
| - | public void mouseReleased(MouseEvent e) { | ||
| - | } | ||
| - | }); | ||
| - | | ||
| - | frame.add(button, | ||
| - | |||
| - | textFieldPanel = new JPanel(new GridLayout(4, | ||
| - | | ||
| - | textFieldPanel.add(new JLabel(" | ||
| - | actionEventTextField = new JTextField("", | ||
| - | textFieldPanel.add(actionEventTextField); | ||
| - | | ||
| - | textFieldPanel.add(new JLabel(" | ||
| - | keyEventTextField = new JTextField("", | ||
| - | keyEventTextField.addKeyListener( new KeyListener() { | ||
| - | public void keyTyped(KeyEvent e) { | ||
| - | keyEventTextField.setText(" | ||
| - | } | ||
| - | public void keyPressed(KeyEvent e) { | ||
| - | keyEventTextField.setText("" | ||
| - | } | ||
| - | public void keyReleased(KeyEvent e) { | ||
| - | if(e.getKeyCode() == KeyEvent.VK_SHIFT || | ||
| - | | ||
| - | | ||
| - | ) | ||
| - | return; | ||
| - | String str = keyEventTextField.getText(); | ||
| - | str = str.substring(0, | ||
| - | keyEventTextField.setText(str); | ||
| - | } | ||
| - | }); | ||
| - | textFieldPanel.add(keyEventTextField); | ||
| - | | ||
| - | textFieldPanel.add(new JLabel(" | ||
| - | mouseEventTextField = new JTextField("", | ||
| - | textFieldPanel.add(mouseEventTextField); | ||
| - | | ||
| - | textFieldPanel.add(new JLabel(" | ||
| - | mouseMotionEventTextField = new JTextField("", | ||
| - | frame.addMouseMotionListener( new MouseMotionListener() { | ||
| - | public void mouseDragged(MouseEvent e) { | ||
| - | } | ||
| - | public void mouseMoved(MouseEvent e) { | ||
| - | mouseMotionEventTextField.setText(" | ||
| - | } | ||
| - | }); | ||
| - | textFieldPanel.add(mouseMotionEventTextField); | ||
| - | | ||
| - | frame.add(textFieldPanel, | ||
| - | | ||
| - | frame.pack(); | ||
| - | frame.setVisible(true); | ||
| - | } | ||
| - | | ||
| - | public static void main(String []args) { | ||
| - | new EventHandling(); | ||
| - | } | ||
| - | } | ||
| - | </ | ||