Ειδικά Θέματα Προγραμματισμού Ενότητα 8: Java Swing Μιχάλας Άγγελος Τμήμα Μηχανικών Πληροφορικής ΤΕ
Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς. 2
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα του ΤΕΙ Δυτικής Μακεδονίας και της Ανώτατης Εκκλησιαστικής Ακαδημίας Θεσσαλονίκης» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους. 3
Java Swing
Σκοποί ενότητας Σε αυτή την παρουσίαση θα ασχοληθούμε με το Java Swing. Λόγω του γεγονότος ότι το μάθημα απευθύνεται άτομα με κάποια εμπειρία στον προγραμματισμό, κάποια θέματα του βιβλίου θεωρούνται γνωστά κι έχουν παραληφθεί στην παρουσίαση. 5
Περιεχόμενα ενότητας (1/3) Γραφικές διεπαφές τύπου Swing (Swing GUI). Υψηλού Επιπέδου Swing Containers και Swing Components. Η ιεραρχία των υψηλού επιπέδου Swing containers. H ιεραρχία της Jcomponent. Containers υψηλού επιπέδου. Containers γενικού σκοπού. 6
Περιεχόμενα ενότητας (2/3) Containers ειδικού σκοπού. Βασικά στοιχεία ελέγχου. Παρουσίαση μη επεξεργάσιμης πληροφορίας. Διαδραστική παρουσίαση μορφοποιημένης πληροφορίας. 7
Περιεχόμενα ενότητας (3/3) Παράδειγμα εφαρμογής Swing. Διαχειριστές Γεγονότων - Event Handlers. Τύποι γεγονότων. Swing και Thread. Η χρήση της μεθόδου invokelate. Παράδειγμα χρήσης της μεθόδου invokelater. 8
Γραφικές διεπαφές τύπου Swing (Swing GUI) Τα πακέτα που αρχίζουν με το πρόθεμα javax.swing παρέχουν ευέλικτα και ισχυρά εργαλεία ανάπτυξης GUI. Ιδιαίτερα το πακέτο javax.swing αναπτύχθηκε κυρίως λόγω των ανεπαρκειών του Abstract Windows Toolkit (AWT). Π.χ. η κλάση JButton που ορίζεται σε αυτό, υπερτερεί της AWT Button κλάσης επιτρέποντας την ύπαρξη όχι μόνο απλού κείμενου, αλλά και εικόνων στα κουμπιά. 9
Υψηλού Επιπέδου Swing Containers και Swing Components (1/2) Κάθε γραφική διεπαφή τύπου Swing πρέπει να έχει τουλάχιστον ένα top-level Swing container. Ένα top-level Swing container παρέχει την απαραίτητη υποστήριξη που χρειάζονται τα Swing components για την εμφάνισή τους και την διαχείριση των γεγονότων που αυτά παράγουν. Υπάρχουν τρία top-level Swing containers: το JFrame, το JDialog, και (για applets) το JApplet. 10
Υψηλού Επιπέδου Swing Containers και Swing Components (2/2) Κάθε JFrame αντικείμενο δημιουργεί ένα κύριο γραφικό παράθυρο, κάθε JDialog αντικείμενο δημιουργεί ένα δευτερεύον παράθυρο (δηλ. παράθυρο που εξαρτάται από κάποιο άλλο παράθυρο). Κάθε JApplet αντικείμενο δημιουργεί την περιοχή εμφάνισης ενός applet στο παράθυρο του Web Browser. 11
Η ιεραρχία των υψηλού επιπέδου Swing containers Σχήμα 1. Η ιεραρχία των υψηλού επιπέδου Swing containers, πηγή: «Εισαγωγή στη γλώσσα προγραμματισμού Java», σελ. 59, ανακτήθηκε 10/2013. 12
H ιεραρχία της JComponent Με εξαίρεση τα top-level containers, π.χ. το JFrame, όλα τα Swing components είναι υποκλάσεις της κλάσης JComponent. Σχήμα 2. H ιεραρχία της Jcomponent, πηγή: «Εισαγωγή στη γλώσσα προγραμματισμού Java», σελ. 59, ανακτήθηκε 10/2013. 13
Containers Υψηλού Επιπέδου Τα Container στην κορυφή οποιασδήποτε Swing ιεραρχίας. Σχήμα 3. Container στην κορυφή οποιασδήποτε Swing ιεραρχίας, πηγή: «Εισαγωγή στη γλώσσα προγραμματισμού Java», σελ.60, ανακτήθηκε 10/2013. 14
Containers γενικού σκοπού Ενδιάμεσα Container που μπορούν να χρησιμοποιηθούν κάτω από πολλές διαφορετικές περιστάσεις. Σχήμα 4. Containers γενικού σκοπού, πηγή: «Εισαγωγή στη γλώσσα προγραμματισμού Java», σελ.60, ανακτήθηκε 10/2013. 15
Containers ειδικού σκοπού Ενδιάμεσα Container που διαδραματίζουν συγκεκριμένους ρόλους σε ένα GUI. Σχήμα 5. Containers ειδικού σκοπού, πηγή: «Εισαγωγή στη γλώσσα προγραμματισμού Java», σελ.61, ανακτήθηκε 10/2013. 16
Βασικά στοιχεία ελέγχου Ατομικά Component που υπάρχουν πρωτίστως για να πάρουν δεδομένα από το χρήστη, επίσης εν γένει παρουσιάζουν κάποια κατάσταση. Σχήμα 6. Βασικά στοιχεία ελέγχου, πηγή: «Εισαγωγή στη γλώσσα προγραμματισμού Java», σελ.61, ανακτήθηκε 10/2013. 17
Παρουσίαση μη επεξεργάσιμης πληροφορίας Ατομικά Component που υπάρχουν απλώς για να δώσουν πληροφορίες στον χρήστη. Σχήμα 7. Παρουσίαση μη επεξεργάσιμης πληροφορίας, πηγή: «Εισαγωγή στη γλώσσα προγραμματισμού Java», σελ.62, ανακτήθηκε 10/2013. 18
Διαδραστική παρουσίαση μορφοποιημένης πληροφορίας Ατομικά Component που εμφανίζουν πληροφορίες με συγκεκριμένη μορφοποίηση η οποία μπορεί να τροποποιηθεί από το χρήστη. Σχήμα 8. Διαδραστική παρουσίαση μορφοποιημένης πληροφορίας, πηγή: «Εισαγωγή στη γλώσσα προγραμματισμού Java», σελ.62, ανακτήθηκε 10/2013. 19
Παράδειγμα εφαρμογής Swing (1/5) Στη συνέχεια θα παρουσιαστούν οι λειτουργίες των Swing κλάσεων μέσω ενός παραδείγματος: Jframe. Jpanel. Jbutton. Οι χρήση των υπολοίπων Swing Components είναι παρόμοια. 20
Παράδειγμα εφαρμογής Swing (2/5) Συνήθως, όταν υλοποιείται μια GUI εφαρμογή σε Swing, δημιουργούμε ένα JFrame αντικείμενο και επιλέγουμε συγκεκριμένο πλάνο ή σχέδιο (layout) για αυτό. Κατόπιν τοποθετούμε ένα ή περισσότερα JPanels στο Jframe. Τα JPanels διαθέτουν επίσης επιλογές layout όπως και τα JFrames. Στη συνέχεια, μπορούμε να προσθέτουμε και άλλα αντικείμενα τύπου Component. 21
Παράδειγμα εφαρμογής Swing (3/5) 22
Παράδειγμα εφαρμογής Swing (4/5) //Δημιουργία ενός Jframe: JFrame fr = new JFrame(); //Τοποθέτηση του pane στο Jframe: fr.setcontentpane(pane); fr.setdefaultcloseoperation(jframeexit_on_close); fr.setlocation(200, 200); fr.pack(); fr.setvisible(true); //Εμφάνιση του JFrame }} Σχήμα 9. Αποτέλεσμα εφαρμογής, πηγή: «Εισαγωγή στη γλώσσα προγραμματισμού Java», σελ.63, ανακτήθηκε 10/2013. 23
Παράδειγμα εφαρμογής Swing (5/5) Τα JButton, JPanel και JFrame αντικείμενα διαθέτουν πολύ περισσότερες λειτουργίες από αυτές που παρουσιάστηκαν και μπορούν να χρησιμοποιηθούν. Στο απλό παράδειγμα που παρουσιάστηκε, κάνοντας κλικ στο κουμπί δεν φέρνει κανένα αποτέλεσμα, αλλά κάνοντας κλικ στο "Χ" του παραθύρου τερματίζει το πρόγραμμα. 24
Διαχειριστές Γεγονότων - Event Handlers (1/3) Για να δίνεται αποτέλεσμα κάνοντας κλικ στο κουμπί του παραπάνω παραδείγματος, χρειάζεται να προσθέσουμε στο component (JButton αντικείμενο) τον κατάλληλο ακροατή γεγονότων (ButtonListener). 25
Διαχειριστές Γεγονότων - Event Handlers (2/3) Έτσι όταν ο χρήστης πατήσει το κουμπί, ο ακροατής προκαλείται και καλούνται οι κατάλληλες μέθοδοί του (διαχειριστές γεγονότων). Η εργασία αυτή γίνεται με τον ίδιο τρόπο που ορίζονται οι ακροατές γεγονότων στα Abstract Window Toolkit (AWT) Component. 26
Διαχειριστές Γεγονότων - Event Handlers (3/3) Προσθήκη ακροατή γεγονότων για το αντικείμενο JButton : btn.addactionlistener(new ButtonListener()); static class ButtonListener implements ActionListener {public void actionperformed(actionevent e) {//Εδώ προστίθεται ο κώδικας που θα εκτελεστεί με το πάτημα του button } } 27
Τύποι γεγονότων Πίνακας 1. Ενδεικτικοί τύποι γεγονότων (events) στο Swing, πηγή: «Εισαγωγή στη γλώσσα προγραμματισμού Java», σελ.65, ανακτήθηκε 10/2013.. 28
Swing και Threads (1/4) H μετάβαση από τα AWT στα Swing GUI παρουσιάζει κάποιο μικρό πρόβλημα σε σχέση με τα Threads. Όλες οι AWT κλάσεις είναι συμβατές με τα threads (thread safe) ενώ οι swing κλάσεις δεν είναι. Μέσω των synchnonized μεθόδων η Java επιτυγχάνει τoν συγχρονισμό των threads που έχουν πρόσβαση σε κάποιο κοινό αντικείμενο. 29
Swing και Threads (2/4) Οι AWT μέθοδοι συγχρονίζονται την στιγμή της αρχικοποίησης του αντίστοιχου αντικειμένου τους στην οθόνη. Έτσι εμποδίζονται πιθανά αδιέξοδα (deadlocks) που επιφέρουν το «κρέμασμα» εφαρμογών την στιγμή της εμφάνισης γραφικών αντικείμενων (πχ. buttons, panels, κλπ) στην οθόνη. 30
Swing και Threads (3/4) Οι swing κλάσεις δεν είναι thread-safe. Ο κώδικας διαχείρισης γεγονότων στις Swing εφαρμογές εκτελείται μέσα από μια συγκεκριμένη thread η οποία ονομάζεται event-dispatching thread. Με αυτό τον τρόπο επιτυγχάνεται ο κώδικας ενός event handler να τελειώνει πριν την εκτέλεση του κώδικα ενός άλλου event handler. 31
Swing και Threads (4/4) Για την αποφυγή πιθανού αδιεξόδου (deadlock), είναι απαραίτητο και τα Swing components να δημιουργούνται, τροποποιούνται και ερωτούνται για την κατάστασή τους μέσα από την eventdispatching thread. 32
Η χρήση της μεθόδου invokelater (1/2) Η κλήση της μεθόδου invokelater μέσα από κάποιο thread ζητά από την eventdispatching thread να εκτελέσει κάποιο κώδικα. Ο συγκεκριμένος κώδικας πρέπει να γραφτεί μέσα στην μέθοδο run ενός αντικειμένου τύπου Runnable και το Runable αντικείμενο να ορισθεί ως παράμετρος της μεθόδου invokelater. 33
Η χρήση της μεθόδου invokelater (2/2) Η invokelater μέθοδος επιστρέφει αμέσως χωρίς να περιμένει την εκτέλεση του συγκεκριμένου κώδικα από την eventdispatching thread. 34
Παράδειγμα χρήσης της μεθόδου invokelater (1/3) 35
Παράδειγμα χρήσης της μεθόδου invokelater (2/3) Στη συνέχεια το αρχικό παράδειγμα του κεφαλαίου τροποποιήθηκε ώστε να εκτελεί τον κώδικα δημιουργίας του GUI στην event-dispatching thread μέσω της μέθόδου invokelater. Για να αποφύγουμε κρεμάσματα σε Swing εφαρμογές είναι σκόπιμο να εκτελείται ο κώδικας εμφάνισης των GUI στην event-dispatching thread μέσω της μεθόδου invokelater. 36
Παράδειγμα χρήσης της μεθόδου invokelater (3/3) Παρόμοια με την invokelater είναι και η μέθοδος invokeandwait που μπορείτε να αναφερθείτε σε αυτή. 37
Βιβλιογραφία 1. Java προγραμματισμός, Όγδοη έκδοση, Deitel Paul J., Deitel Harvey M., Εκδόσεις Γκιούρδας Μ.. 2. Απόλυτη Java, Savitch, Εκδόσεις ΙΩΝ, 2008. 3. Πλήρες εγχειρίδιο της Java 6, Lemay Cadenhead, Εκδόσεις Γκιούρδας Μ., Αθήνα 2007. 4. www.ebooks4greeks.gr, προσπελάστηκε 10/2013. 38
Τέλος Ενότητας