swing:intro

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revision Both sides next revision
swing:intro [2018/03/19 18:14]
gthanos [Events και Listeners]
swing:intro [2018/03/20 17:46]
gthanos [Χρήση μίας ανώνυμης κλάσης ActionListener]
Line 1: Line 1:
 ====== Δημιουργία παραθυρικών εφαρμογών με Swing ====== ====== Δημιουργία παραθυρικών εφαρμογών με Swing ======
  
-Σε αυτή την ενότητα θα δούμε πως μπορούμε να κατασκευάσουμε παραθυρικές εφαρμογές (Graphical User Interfaces, GUIs) με χρήση της βιβλιοθήκης **Swing**. Οι παραθυρικές εφαρμογές είναι διαφορετικές από τις εφαρμογές που χρησιμοποιούν την κονσόλα για είσοδο και έξοδο, με την έννοια ότι δεν υφίσταται μία συνεχής ροή προγράμματος, αλλά τμήματα του προγράμματος, εκτελούνται μετά την δημιουργία ενός ερεθίσματος, που ονομάζεται **event**. Το ερέθισμα αυτό κατά κανόνα δημιουργείται από τον χρήστη που αλληλεπιδρά με το πρόγραμμα μέσω του ποντικιού και του πληκτρολογίου. Το πρόγραμμα εκτελείται όταν δοθεί το επόμενο ερέθισμα από τον χρήστη και να δημιουργηθεί το αντίστοιχo event. Επειδή, το πρόγραμμα υπακούει σε ερεθίσματα, το μοντέλο αυτό είναι γνωστό ως //event driven programming// (προγραμματισμός με βάση events).+Σε αυτή την ενότητα θα δούμε πως μπορούμε να κατασκευάσουμε παραθυρικές εφαρμογές (Graphical User Interfaces, GUIs) με χρήση της βιβλιοθήκης **Swing**. Οι παραθυρικές εφαρμογές είναι διαφορετικές από τις εφαρμογές που χρησιμοποιούν την κονσόλα για είσοδο και έξοδο, με την έννοια ότι δεν υφίσταται μία συνεχής ροή προγράμματος, αλλά τμήματα του προγράμματος, εκτελούνται μετά την δημιουργία ενός ερεθίσματος, που ονομάζεται **event**. Το ερέθισμα αυτό κατά κανόνα δημιουργείται από τον χρήστη που αλληλεπιδρά με το πρόγραμμα/γραφικό περιβάλλον μέσω του ποντικιού και του πληκτρολογίου. Το πρόγραμμα εκτελείται κάθε φορά που θα δοθεί το επόμενο ερέθισμα από τον χρήστη, με συνέπεια να δημιουργηθεί το αντίστοιχo //event//. Επειδή, το πρόγραμμα υπακούει σε ερεθίσματα, το μοντέλο αυτό είναι γνωστό ως //event driven programming// (προγραμματισμός με βάση events).
  
-Το παρακάτω σχήμα δείχνει εποπτικά την διαδικασία δημιουργίας ενός event που προκύπτει από το πάτημα ενός κουμπιού (button) με το ποντίκι. Το event "πιάνεται" από ένα event listener και στη στη συνέχεια εκτελείται κώδικας που έχει θεσπιστεί για το event αυτό. +Το παρακάτω σχήμα **Α** δείχνει το παράδειγμα μίας εφαρμογής swing που αποτελείται από μόνο ένα κουμπί (button). O χρήστης κάθε φορά που πατά το κουμπί με το ποντίκι (αριστερό click) δημιουργείται ένα event του τύπου ActionEvent. To event μπορούμε να επιλέξουμε να ιαστεί" από ένα αντικείμενο του τύπου //event listener//, το οποίο παρέχει κώδικα που θα εκτελεστεί για το event αυτό. Στο σχήμα **Β** δίνεται εποπτικά η διαδικασία δημιουργίας αλλά και "πιασίματος" του event από τον //event listener//.
- +
-{{  :swing:swingeventhandlingprocess.png  |}}+
  
 +^Α. Παράδειγμα γραφικού περιβάλλοντος java/swing  ^ B. Διαδικασία δημιουργίας και "πιασίματος" ενός event από ένα αντικείμενο τύπου //event listener//  ^
 +|{{  :swing:swing-button1.png?200  }} | {{  :swing:swingeventhandlingprocess.png  }} |
  
 <WRAP tip 80% center round> <WRAP tip 80% center round>
Line 14: Line 14:
 Το γραφικό περιβάλλον μίας εφαρμογής αποτελείται από αντικείμενα που αντιπροσωπεύουν οντότητες με τις οποίες ο χρήστης μπορεί να αλληλεπιδράσει. Παραδείγματα, τέτοιων οντοτήτων είναι τα 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 που υποδεικνύει ότι ένα παράθυρο έχει αλλάξει την κατάστασή του. Αυτό το συμβάν χαμηλού επιπέδου δημιουργείται από ένα παράθυρο όταν ανοίγεται, κλείνεται, ενεργοποιείται, απενεργοποιείται, γίνεται minimize ή όταν το παράθυρο γίνεται ενεργό ή ανενεργό.  
  
-===== Πιάνοντας ένα event μέσω ενός Event Listener ===== 
  
 ===== Το πρώτο μου πρόγραμμα ===== ===== Το πρώτο μου πρόγραμμα =====
Line 107: Line 88:
 firstWindow.setVisible(true); firstWindow.setVisible(true);
 </code> </code>
-==== Χρήση μίας ανώνυμης κλάσης ActionListener ====+==== Χρήση μίας ανώνυμης κλάσης ActionListener σε αντικατάσταση της κλάσης EndingListener ====
  
 Για να μην έχουμε πολλαπλά αρχεία, μία παραλλαγή των παραπάνω είναι να τοποθετήσουμε την κλάση EndingListener σε μία ανώνυμη κλάση, ως εξής: Για να μην έχουμε πολλαπλά αρχεία, μία παραλλαγή των παραπάνω είναι να τοποθετήσουμε την κλάση EndingListener σε μία ανώνυμη κλάση, ως εξής:
swing/intro.txt · Last modified: 2020/03/16 10:45 (external edit)