| Both sides previous revision
Previous revision
Next revision
|
Previous revision
Next revision
Both sides next revision
|
swing:intro [2018/03/20 08:26] gthanos [Δημιουργία παραθυρικών εφαρμογών με Swing] |
swing:intro [2018/03/20 17:46] gthanos [Χρήση μίας ανώνυμης κλάσης ActionListener] |
| Το γραφικό περιβάλλον μίας εφαρμογής αποτελείται από αντικείμενα που αντιπροσωπεύουν οντότητες με τις οποίες ο χρήστης μπορεί να αλληλεπιδράσει. Παραδείγματα, τέτοιων οντοτήτων είναι τα buttons, text boxes, textfields, radio buttons, menu items κ.α. Στην παρακάτω εικόνα δίνεται μία απλή εφαρμογή calculator. Κάθε αριθμός ή τελεστής αριθμητικής πράξης είναι αποθηκευμένο σε ένα αντικείμενο τύπου button. Οι ενδιάμεσοι αριθμοί και το αποτέλεσμα της αριθμητικής πράξης εμφανίζεται στο πεδίο κειμένου (textfield) στην κορυφή του παραθύρου. | Το γραφικό περιβάλλον μίας εφαρμογής αποτελείται από αντικείμενα που αντιπροσωπεύουν οντότητες με τις οποίες ο χρήστης μπορεί να αλληλεπιδράσει. Παραδείγματα, τέτοιων οντοτήτων είναι τα buttons, text boxes, textfields, radio buttons, menu items κ.α. Στην παρακάτω εικόνα δίνεται μία απλή εφαρμογή calculator. Κάθε αριθμός ή τελεστής αριθμητικής πράξης είναι αποθηκευμένο σε ένα αντικείμενο τύπου button. Οι ενδιάμεσοι αριθμοί και το αποτέλεσμα της αριθμητικής πράξης εμφανίζεται στο πεδίο κειμένου (textfield) στην κορυφή του παραθύρου. |
| |
| {{ :swing:swingcalculator.png |}} | {{ :swing:swingcalculator.png?200 |}} |
| |
| |
| ===== Events και Listeners ===== | |
| |
| Όταν ο χρήστης πατήσει ένα πλήκτρο από το πληκτρολόγιο ή μετακινήσει το ποντίκι, ο **//window manager//** στέλνει μία ειδοποίηση (//event//) που σηματοδοτεί την ενέργεια που έκανε ο χρήστης. Για παράδειγμα, πατώντας με τη βοήεια του ποντικιού (αριστερό click) ένα κουμπί από το γραφικό περιβάλλον, μετακινώντας το ποντίκι πάνω στο ενεργό παράθυρο ή εισάγοντας ένα χαρακτήρα από το πληκτρολόγιο παράγεται ένα event που σηματοδοτεί την αλλαγή που έκανε ο χρήστης. | |
| |
| Ο **//window manager//** δημιουργεί //events// για κάθε απειροελάχιστη μεταβολή της θέσης του ποντικιού ή για το πάτημα ενός κουμπιού από το πληκτρολόγιο. Τα περισσότερα προγράμματα δεν τα ενδιαφέρει το σύνολο των //events// που παράγονται. Προκειμένου ένα πρόγραμμα να μην "βομβαρδίζεται" με πολλά διαφορετικά events τα οποία του είναι αδιάφορα θα πρέπει να θεσπίσει του δικούς του κανόνες για το ποια events το ενδιαφέρουν. Η θέσπιση των κανόνων αυτών γίνεται μέσα από αντικείμενα τύπου event listeners, τα οποία ακούν σε συγκεκριμένου τύπου events. | |
| |
| Θα πρέπει να τονίσουμε ότι υπάρχουν πολλοί διαφορετικοί τύποι event. Για παράδειγμα, η μετακίνηση του ποντικιού ή το πάτημα ενός κουμπιου από το ποντίκι παράγει ένα **MouseEvent** ενώ το πάτημα ενός κουμπιού ή η επιλογή ενός menu παράγει ένα **ActionEvent**. Επομένως, τo κάθε πρόγραμμα θα πρέπει να θεσπίσει τους κατάλληλους event //listeners// που "πιάνουν" τα event που παράγονται από τις οντότητες του γραφικού περιβάλλοντος που μας ενδιαφέρουν. Η διαδικασία "πιασήματος" και αντίδρασης του προγράμματος σε ένα event, ονομάζεται //event handling//. | |
| ===== Οι βασικοί τύποι των διαφορετικών Event ===== | |
| |
| Οι κλάσεις των events βρίσκονται μέσα στο πακέτο **java.awt.event**. Οι κυριότεροι τύποι event είναι οι εξής: | |
| |
| * **AWTEvent:** Είναι η γονική κλάση για όλα τα αντικείμενα τύπου event. Αυτή η κλάση και οι υποκατηγορίες της κληρονομούν την κλάση java.awt.Event. | |
| * **ActionEvent:** Ένα ActionEvent δημιουργείται όταν πατήσετε ένα button του γραφικού περιβάλλοντος ή επιλέξετε το στοιχείο μίας λίστας ή επιλέξετε ένα στοιχείο από το μενού της εφαρμογής. | |
| * **KeyEvent:** Παράγεται όταν πατιέται ένα πλήκτρο από το πληκτρολόγιο. | |
| * **MouseEvent:** Παράγεται α) σε κάθε μεταβολή της θέσης του ποντικιού και β) σε κάθε πάτημα των πλήκτρων του ποντικιού. | |
| * **MouseWheelEvent:** Παράγεται σε κάθε μετακίνηση της ροδέλας του ποντικιού. | |
| * **WindowEvent:** Ένα event που υποδεικνύει ότι ένα παράθυρο έχει αλλάξει την κατάστασή του. Αυτό το //event// δημιουργείται από ένα παράθυρο όταν ανοίγει, κλείνει, ενεργοποιείται ή απενεργοποιείται ή γίνεται minimize ή maximize. | |
| |
| ===== Event Listeners ===== | |
| |
| Για τον πιάσιμο των παραπάνω τύπων events, η Java ορίζει ένα σύνολο από interfaces, τα οποία τα οποία όταν υλοποιούνται σε μία κλάση έχουν την δυνατότητα να πιάνουν συγκεκριμένους τύπους από events. Οι κυριότεροι Event Listeners είναι οι εξής: | |
| * **java.util.EventListener:** Γενικό interface που πρέπει να υλοποιούν όλα τα αντικείμενα τύπου EventListener. Όλα τα subinterfaces του συγκεκριμένου interface που μας ενδιαφέρουν βρίσκονται στο πακέτο **java.awt.event**. | |
| * **ActionListener:** | |
| * **KeyListener:** | |
| * **MouseListener:** | |
| * **MouseMotionListener:** | |
| * **MouseWheelListener:** | |
| * **WindowListener:** | |
| ===== Πιάνοντας ένα event μέσω ενός Event Listener ===== | |
| |
| ===== Το πρώτο μου πρόγραμμα ===== | ===== Το πρώτο μου πρόγραμμα ===== |
| firstWindow.setVisible(true); | firstWindow.setVisible(true); |
| </code> | </code> |
| ==== Χρήση μίας ανώνυμης κλάσης ActionListener ==== | ==== Χρήση μίας ανώνυμης κλάσης ActionListener σε αντικατάσταση της κλάσης EndingListener ==== |
| |
| Για να μην έχουμε πολλαπλά αρχεία, μία παραλλαγή των παραπάνω είναι να τοποθετήσουμε την κλάση EndingListener σε μία ανώνυμη κλάση, ως εξής: | Για να μην έχουμε πολλαπλά αρχεία, μία παραλλαγή των παραπάνω είναι να τοποθετήσουμε την κλάση EndingListener σε μία ανώνυμη κλάση, ως εξής: |