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 [2017/04/04 15:53]
gthanos [Το παραπάνω παράθυρο ως αυτόνομη κλάση]
swing:intro [2018/03/20 17:46]
gthanos [Χρήση μίας ανώνυμης κλάσης ActionListener]
Line 1: Line 1:
 ====== Δημιουργία παραθυρικών εφαρμογών με Swing ====== ====== Δημιουργία παραθυρικών εφαρμογών με Swing ======
  
-Σε αυτή την ενότητα θα δούμε πως μπορούμε να κατασκευάσουμε παραθυρικές εφαρμογές (Graphical User Interfaces, GUIs) με χρήση της βιβλιοθήκης Swing. Οι παραθυρικές εφαρμογές είναι διαφορετικές από τις εφαρμογές που έχουμε συναντήσει μέχρι τώρα, με την έννοια ότι δεν υπάρχει μία συνεχής ροή προγράμματος, αλλά το πρόγραμμα εκτελείται μετά την δημιουργία ενός ερεθίσματος (event). Το ερέθισμα αυτό κατά κανόνα δημιουργείται από τον χρήστη που χρησιμοποιεί το πρόγραμμα. Το πρόγραμμα εκτελείται και στη συνέχεια σταματά και πάλι μέχρι να δοθεί το επόμενο ερέθισμα (event). Επειδή, το πρόγραμμα υπακούει σε ερεθίσμα, το μοντέλο αυτό είναι γνωστό ως //event driven programming// (προγραμματισμός με βάση events).+Σε αυτή την ενότητα θα δούμε πως μπορούμε να κατασκευάσουμε παραθυρικές εφαρμογές (Graphical User Interfaces, GUIs) με χρήση της βιβλιοθήκης **Swing**. Οι παραθυρικές εφαρμογές είναι διαφορετικές από τις εφαρμογές που χρησιμοποιούν την κονσόλα για είσοδο και έξοδο, με την έννοια ότι δεν υφίσταται μία συνεχής ροή προγράμματος, αλλά τμήματα του προγράμματος, εκτελούνται μετά την δημιουργία ενός ερεθίσματος, που ονομάζεται **event**. Το ερέθισμα αυτό κατά κανόνα δημιουργείται από τον χρήστη που αλληλεπιδρά με το πρόγραμμα/γραφικό περιβάλλον μέσω του ποντικιού και του πληκτρολογίου. Το πρόγραμμα εκτελείται κάθε φορά που θα δοθεί το επόμενο ερέθισμα από τον χρήστη, με συνέπεια να δημιουργηθεί το αντίστοιχo //event//. Επειδή, το πρόγραμμα υπακούει σε ερεθίσματα, το μοντέλο αυτό είναι γνωστό ως //event driven programming// (προγραμματισμός με βάση events).
  
-===== Events και Listeners =====+Το παρακάτω σχήμα **Α** δείχνει το παράδειγμα μίας εφαρμογής swing που αποτελείται από μόνο ένα κουμπί (button). O χρήστης κάθε φορά που πατά το κουμπί με το ποντίκι (αριστερό click) δημιουργείται ένα event του τύπου ActionEvent. To event μπορούμε να επιλέξουμε να "πιαστεί" από ένα αντικείμενο του τύπου //event listener//, το οποίο παρέχει κώδικα που θα εκτελεστεί για το event αυτό. Στο σχήμα **Β** δίνεται εποπτικά η διαδικασία δημιουργίας αλλά και "πιασίματος" του event από τον //event listener//.
  
-Τα παραθυρικά προγράμματα Swing χρησιμοποιούν events και //event handlers//Ένα event είναι ένα αντικείμενο που λειτουργεί ως ερέθισμα σε ένα άλλο αντικείμενο που καλείται //listener//. Το αντικείμενο που δημιουργεί το event είναι συνήθως κάποιο τμήμα του γραφικού περιβάλλοντος (π.χ. ένα κουμπί ή μία επιλογή στο μενού) το οποίο θα το αποκαλούμε //component// ή //graphical component//, ως αποτέλεσμα του γεγονότος ότι επιλέχθηκε (π.χ. έγινε click). Το αντικείμενο που αποκαλέσαμε νωρίτερα //listener// εκτελεί κάποιον κώδικα ως απάντηση στο ερέθισμα που δέχθηκε. Για παράδειγμα, θα μπορούσε να εκτυπώσει ένα μήνυμα στην οθόνη ή ένα μήνυμα στην κονσόλα. Ένα γραφικό component μπορεί να συνδέεται με μία σειρά από listeners, όπου κάθε ένας από τους listeners αυτούς να ανταποκρίνεται σε διαφορετικό ερέθισμα (event). +Παράδειγμα γραφικού περιβάλλοντος java/swing  ^ BΔιαδικασία δημιουργίας και "πιασίματος" ενός event από ένα αντικείμενο τύπου //event listener//  ^ 
- +|{{  :swing:swing-button1.png?200  }} | {{  :swing:swingeventhandlingprocess.png  }} |
-<code> +
-         -----------------         /------\          --------------- +
-          Graphical    |        /        \                     | +
-          Component    | ----> [  Event   ] ---->  |  Listener   | +
-                              \        /                     | +
-         -----------------         \------/          --------------- +
-</code> +
- +
-Το παραπάνω σχήμα απεικονίζει γραφικά την σχέση μεταξύ ενός //component// και ενός //listener//. Ένας listener μπορεί να έχει περισσότερες από μία μεθόδους που συνδέονται με λειτουργίες που θα εκτελεστούν κατά την λήψη ενός event. Οι μέθοδοι αυτές λέγονται //event handlers//. Κάθε πρόγραμμα καλείται να ορίσει ή να επαναορίσει (εάν είναι ήδη ορισμένοι) τους δικούς του event handlers για τα διαφορά events που μπορεί να συμβούν σε αυτό.+
  
 <WRAP tip 80% center round> <WRAP tip 80% center round>
-Βασικό χαρακτηριστικό του event driven προγραμματισμού είναι ότι δημιουργούμε αντικείμενα και μεθόδους (event listeners) τα οποία δεν γνωρίζουμε αν θα κληθούν και με ποια σειρά θα κληθούν, καθώς αυτό εξαρτάται από τον χρήστη που χρησιμοποιεί το πρόγραμμα. Ο προγραμματιστής κατά κανόνα δεν έχει έλεγχο της σειράς εκτέλεσης των μεθόδων αυτών.+Βασικό χαρακτηριστικό του event driven προγραμματισμού είναι ότι δημιουργούμε αντικείμενα και μεθόδους (event listeners) τα οποία δεν γνωρίζουμε αν θα κληθούν και με ποια σειρά θα κληθούν, καθώς αυτό εξαρτάται από τον χρήστη που χρησιμοποιεί το πρόγραμμα. Ο προγραμματιστής κατά κανόνα δεν έχει τον έλεγχο της σειράς εκτέλεσης των μεθόδων που ορίζει.
 </WRAP> </WRAP>
 +
 +Το γραφικό περιβάλλον μίας εφαρμογής αποτελείται από αντικείμενα που αντιπροσωπεύουν οντότητες με τις οποίες ο χρήστης μπορεί να αλληλεπιδράσει. Παραδείγματα, τέτοιων οντοτήτων είναι τα buttons, text boxes, textfields, radio buttons, menu items κ.α. Στην παρακάτω εικόνα δίνεται μία απλή εφαρμογή calculator. Κάθε αριθμός ή τελεστής αριθμητικής πράξης είναι αποθηκευμένο σε ένα αντικείμενο τύπου button. Οι ενδιάμεσοι αριθμοί και το αποτέλεσμα της αριθμητικής πράξης εμφανίζεται στο πεδίο κειμένου (textfield) στην κορυφή του παραθύρου.
 +
 +{{ :swing:swingcalculator.png?200 |}}
 +
 +
  
 ===== Το πρώτο μου πρόγραμμα ===== ===== Το πρώτο μου πρόγραμμα =====
Line 91: 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)