exercise 6new_10 12/5/2008 12.6. Άσκηση 6 - [αξιοποίηση γραφικής διεπαφής (GUI)] (έκδοση 2006) 12.6.1. Περιγραφή Θεωρήστε την γραφική διεπαφή της αριθµοµηχανής των MS Windows. Μια παρόµοια διεπαφή (δες σχήµα 6.1) ορίζεται από την κλάση CalculatorGui. Η διεπαφή αυτή σας δίνεται µε τη µορφή Java κλάσεων σε bytecodes στο αρχείο CalcGuiV1Exer6.zip ή CalcGuiV1Exer6.jar (δες δικτυακό τόπο του βιβλίου). Σχήµα 6.1. Γραφική διεπαφή της έκδοσης 1 του CalculatorGui. Η κλάση CalculatorGui έχει ένα δηµιουργό που δέχεται ένα όρισµα τύπου Operand. Την αναφορά αυτή χρησιµοποιεί το στιγµιότυπο της κλάσης CalculatorGui για να επικοινωνήσει µε το συγκεκριµένο στιγµιότυπο της Operand αποστέλλοντας του κατάλληλα µηνύµατα σε απόκριση της δράσης του χρήστη επί της γραφικής διεπαφής. Στα πλαίσια της άσκησης αυτής θα αναπτύξετε µια πρώτη έκδοση της αριθµοµηχανής χρησιµοποιώντας την γραφική διεπαφή που σας δίνεται. Θα ορίσετε κατάλληλα την κλάση Operand ώστε ο χρήστης να µπορεί να αποδίδει στο στιγµιότυπο της την επιθυµητή τιµή διαµέσου της γραφικής διεπαφής CalculatorGui. 12.6.2. Στόχος Στόχος της άσκησης είναι να έρθετε σε µια πρώτη επαφή µε γραφική διεπαφή (Gui) και να δείτε µε ποιο τρόπο µπορείτε να ενσωµατώσετε στην εφαρµογή σας µια κλάση που σας δίνεται σε bytecodes. Χρόνος εκτέλεσης: Κατά την διάρκεια της µελέτης του κεφαλαίου 8 ή µε την ολοκλήρωση του. Οπωσδήποτε µετά την εκτέλεση της άσκησης 5. 12.6.3. Μεθοδολογία εκτέλεσης Η άσκηση δίνεται σαν ένα σύνολο από δραστηριότητες που πρέπει να εκτελέσετε µόνοι σας. Σε κάθε δραστηριότητα σας δίνονται οδηγίες και βοήθεια ώστε να
Άσκηση 12.6 2 ξεπεράσετε τα δύσκολα σηµεία. Στο τέλος της άσκησης σας δίνονται ενδεικτικές απαντήσεις. ραστηριότητα 1 Αναπτύξτε το πιο απλό πρόγραµµα µε όνοµα Calc.java που θα εµφανίζει στην οθόνη τη γραφική διεπαφή CalculatorGui. Εκτελέστε τις παρακάτω ενέργειες: Αποσυµπιέστε το αρχείο CalcGuiV1Exer6.zip και βάλτε τα αρχεία που περιέχει στο ευρετήριο εργασίας σας. Εναλλακτικά χρησιµοποιήστε το αρχείο CalcGuiV1Exer6.jar. Οδηγίες χρήσης αρχείων.jar θα βρείτε στο αρχείο µε όνοµα UsingJARFiles.pdf ηµιουργήστε ένα πρόγραµµα µε όνοµα Calc.java που θα εµφανίζει την γραφική διεπαφή στην οθόνη. Ορίστε την κλάση Operand ώστε να περιέχει µόνο τον δηµιουργό της. ραστηριότητα 2 Εκτελέστε το πρόγραµµα που µόλις αναπτύξατε. Στην οθόνη θα δείτε την γραφική διεπαφή της αριθµοµηχανής. Τι θα συµβεί αν πατήσετε το πλήκτρο 1. Αιτιολογήστε. ραστηριότητα 3 Ενσωµατώστε στο πρόγραµµα σας την µέθοδο void adddigit(char ch); Μεταγλωττίστε και εκτελέστε. Πιέστε το πλήκτρο 1. Πιέστε το πλήκτρο 2. Τι παρατηρείτε; Μπορείτε να χρησιµοποιήσετε την adddigit(char ch)και µε τις δύο εκδόσεις της Operand δηλαδή a) µε int val; και β) µε StringBuffer val; Προσέξτε πως δεν βλέπετε την τρέχουσα τιµή του op στο display της γραφικής διεπαφής. Θα επανέλθουµε σε αυτό αργότερα. Αιτιολογήστε τη νέα συµπεριφορά του προγράµµατος σας. Πιέστε το πλήκτρο BackSpace. Τι παρατηρείτε; Το πλαίσιο «Σενάριο Λειτουργίας» περιγράφει ένα σενάριο αλληλεπίδρασης του χρήστη µε την γραφική διεπαφή και τις αλληλεπιδράσεις µεταξύ των αντικειµένων της αριθµοµηχανής για τον υπολογισµό της τιµής της έκφρασης 13 6 + 8 6 - *
Άσκηση 12.6 3 Σενάριο λειτουργίας Περιγράφουµε στη συνέχεια ένα σενάριο λειτουργίας της αριθµοµηχανής µε την γραφική διεπαφή για τον υπολογισµό της τιµής της έκφρασης 13 6 + 8 6 - * O χρήστης πιέζει το πλήκτρο 1. Αυτό αποστέλλει το µήνυµα adddigit( 1 ) στο O χρήστης πιέζει το πλήκτρο 3. Αυτό αποστέλλει το µήνυµα adddigit( 3 ) στο push στην στοίβα, η οποία αποθηκεύει ένα αντικείµενο µε τιµή 13. O χρήστης πιέζει το πλήκτρο 6. Αυτό αποστέλλει το µήνυµα adddigit( 6 ) στο push στην στοίβα, η οποία αποθηκεύει ένα αντικείµενο µε τιµή 6. O χρήστης πιέζει το πλήκτρο +. Αυτό αποστέλλει το µήνυµα operate στο στιγµιότυπο Adder της Calc. O Adder αποστέλλει ένα µήνυµα pop στην στοίβα για να πάρει τον ένα τελεστέο. Στη συνέχεια αποστέλλει ένα ακόµη µήνυµα pop στην στοίβα για να πάρει τον δεύτερο τελεστέο. Τους προσθέτει και αποστέλλει ένα µήνυµα push στη στοίβα για να βάλει µέσα το 19. O χρήστης πιέζει το πλήκτρο 8. Αυτό αποστέλλει το µήνυµα adddigit( 8 ) στο push στην στοίβα, η οποία αποθηκεύει ένα αντικείµενο µε τιµή 8. O χρήστης πιέζει το πλήκτρο 6. Αυτό αποστέλλει το µήνυµα adddigit( 6 ) στο push στην στοίβα, η οποία αποθηκεύει ένα αντικείµενο µε τιµή 6. O χρήστης πιέζει το πλήκτρο -. Αυτό αποστέλλει το µήνυµα operate στο στιγµιότυπο Subtracter της Calc. O Subtracter αποστέλλει ένα µήνυµα pop στην στοίβα για να πάρει τον ένα τελεστέο. Στη συνέχεια αποστέλλει ένα ακόµη µήνυµα pop στην στοίβα για να πάρει τον δεύτερο τελεστέο. Τους αφαιρεί και αποστέλλει ένα µήνυµα push στη στοίβα για να βάλει µέσα το 2. O χρήστης πιέζει το πλήκτρο *. Αυτό αποστέλλει το µήνυµα operate στο στιγµιότυπο Multiplier της Calc. O Multiplier αποστέλλει ένα µήνυµα pop στην στοίβα για να πάρει τον ένα τελεστέο (2). Στη συνέχεια αποστέλλει ένα ακόµη µήνυµα pop στην στοίβα για να πάρει τον δεύτερο τελεστέο (19). Τους πολλαπλασιάζει και αποστέλλει ένα µήνυµα push στη στοίβα για να βάλει µέσα το 38. O χρήστης πιέζει το πλήκτρο Enter. Αυτό αποστέλλει το µήνυµα operate στο στιγµιότυπο ResultPresenter της Calc. O ResultPresenter αποστέλλει ένα µήνυµα pop στην στοίβα για να πάρει τον ένα τελεστέο (38). Στη συνέχεια αποστέλλει ένα µήνυµα στο στιγµιότυπο Display για να εµφανίσει το αποτέλεσµα.
Άσκηση 12.6 4 ραστηριότητα 4 ώστε την µέθοδο void deletelastdigit(); Ενδεικτικός κώδικας Ο ενδεικτικός κώδικας που σας δίνεται σχολιάζεται στη συνέχεια. public void deletelastdigit(){ String s =new String(buf); buf = new StringBuffer(s.substring(0,s.length()-1)); } Σχόλια ηµιουργούµε ένα στιγµιότυπο String µε το ίδιο περιεχόµενο µε το αυτό του buf. String s =new String(buf); Για να δηµιουργήσουµε ένα στιγµιότυπο χωρίς τον τελευταίο χαρακτήρα του s του αποστέλλουµε το µήνυµα substring s.substring(0,s.length()-1) Το νέο αυτό στιγµιότυπο χρησιµοποιούµε για να δηµιουργήσουµε ένα νέο στιγµιότυπο StringBuffer και να αναθέσουµε στο buf να δείχνει σε αυτό. buf = new StringBuffer(s.substring(0,s.length()-1)); Τι θα απογίνει το στιγµιότυπο που έδειχνε η αναφορά buf; ραστηριότητα 5 Εκτελέστε το πρόγραµµα που µόλις αναπτύξατε. Ε1. Πατήστε το πλήκτρο C. Τι παρατηρείτε; Αιτιολογήστε. Ενσωµατώστε στην Operand και τις παρακάτω µεθόδους void reset(); void set(double val); Μεταγλωττίστε και εκτελέστε. Ε2. Πατήστε το πλήκτρο C. Τι παρατηρείτε; Αιτιολογήστε. Θα επανέλθουµε στο θέµα στην ραστηριότητα 10 όταν θα σας δοθεί ο πηγαίος κώδικας της CalculatorGui. Ε3. Ποιος είναι ο λόγος που ο δηµιουργός της Operand όρισε την µέθοδο set;
Άσκηση 12.6 5 ραστηριότητα 6 Όταν ο χρήστης ολοκληρώσει τον τελεστέο πατάει το πλήκτρο ENTER για να «µπει» το περιεχόµενο του τελεστέου στην στοίβα. Το πάτηµα του πλήκτρου ENTER έχει σαν αποτέλεσµα την κλήση της µεθόδου complete της Operand. Η µέθοδος αυτή θα πρέπει να βάζει τον τελεστέο σε µια στοίβα. Χρησιµοποιήστε κατάλληλα την κλάση Stack της βασικής βιβλιοθήκης της Java για να γράψετε την µέθοδο complete. Ε1. Ενσωµατώστε στην Operand την συµπεριφορά στο µήνυµα που δέχεται από το πλήκτρο ENTER. void complete(); Ε2. Εκτελέστε το παραπάνω πρόγραµµα και ελέγξτε την συµπεριφορά του. Πατήστε διαδοχικά τα πλήκτρα 1, 2, 9, backspace, 3, ENTER. Είστε σίγουρος για την ορθή συµπεριφορά του προγράµµατος σας; Τροποποιήστε τον κώδικα έτσι ώστε να ελέγξετε την συµπεριφορά αυτή. ραστηριότητα 7 Η κλάση CalculatorGui που σας δόθηκε έχει ένα data member µε όνοµα display που ορίζεται όπως παρακάτω public static TextField display; Αναφερθείτε στην κλάση TextField του πακέτου java.awt της βασικής βιβλιοθήκης για να τροποποιήσετε την κλάση Operand που ορίσατε ώστε να βλέπετε στο display της γραφικής διεπαφής την εκάστοτε τιµή του τελεστέου. Εντοπίστε και αξιοποιήστε την µέθοδο settext. Το data member display έχει οριστεί στην κλάση CalculatorGui σαν data member κλάσης. Είναι η καλύτερη επιλογή; Προτείνατε και υλοποιήστε ένα καλύτερο τρόπο αντιµετώπισης. ραστηριότητα 8 Εκτελέστε την εφαρµογή που αναπτύξατε παραπάνω. Πιέστε το πλήκτρο ΕΝΤΕR. Τι παρατηρείτε; Αιτιολογήστε. Τροποποιήστε το πρόγραµµα σας ώστε να βελτιώσετε την συµπεριφορά του. ραστηριότητα 9 (Προαιρετική) ηµιουργήστε ένα package στο BlueJ και εισάγετε τις παραπάνω κλάσεις. Ελέγξτε βήµα- βήµα τη συµπεριφορά των αντικειµένων στα µηνύµατα που αυτά δέχονται στα πλαίσια εκτέλεσης του προγράµµατος.
Άσκηση 12.6 6 ραστηριότητα 10 - επέκταση λειτουργικότητας Σας δίνεται ο πηγαίος κώδικας της γραφικής διεπαφής CalculatorGui που χρησιµοποιήσατε παραπάνω. (αρχείο CalcGuiV1Exer6Source.zip) O κώδικας αυτός δεν αξιοποιεί σωστά το περιβάλλον υλοποίησης. Θα κληθείτε να τον βελτιώσετε στην επόµενη δραστηριότητα. Στην φάση αυτή όµως µελετήστε τον και εκτελέστε την παρακάτω ενέργεια. Προσθέστε τα πλήκτρα για τις βασικές πράξεις. Χρησιµοποιήστε τις παρακάτω συντεταγµένες Πλήκτρο Συντεταγµένες + 245, 80, 50, 30 = 305, 156, 50, 30 ραστηριότητα 11 - βελτίωση πηγαίου κώδικα Προσπαθήστε να δώσετε µια νέα έκδοση για τον πηγαίο κώδικα η οποία αξιοποιεί καλύτερα τα πλεονεκτήµατα του Αντικειµενοστρεφούς προγραµµατισµού. ραστηριότητα 12 Χρήση της κατασκευής του interface Στα πλαίσια της δραστηριότητας 1 και για να αξιοποιήσετε την κλάση της γραφικής διεπαφής είχατε τον περιορισµό να ονοµάσετε το πρόγραµµα σας Calc. O περιορισµός αυτός µπαίνει από το γεγονός ότι ο δηµιουργός της CalcultorGui για να αναφερθεί στο στιγµιότυπο της Stack του προγράµµατος σας χρησιµοποιεί την αναφορά Calc.st. Επίσης ο δηµιουργός της CalculatorGui έχει δηλώσει ένα data member στην CalculatorGui χρησιµοποιώντας την κλάση Operand. Αυτό έχει ως αποτέλεσµα να τίθεται ο περιορισµός στην ονοµασία της κλάσης που αναπαριστά τον τελεστέο αλλά και περιορισµός στις µεθόδους που πρέπει αυτή να περιέχει (δες δραστηριότητες 3-6). Αντίστοιχος περιορισµός προς διαφορετική κατεύθυνση υπάρχει και στην δραστηριότητα 7. Οι περιορισµοί αυτοί µπορεί να αποφευχθούν ή να εκφρασθούν πιο αυστηρά µε κατάλληλη χρήση της κατασκευής του interface. Αξιοποιώντας την κατασκευή του interface αναπτύξαµε και σας δίνουµε µια νέα γραφική διεπαφή την MyCalculatorGui ή οποία κάνει implements το interface CalculatorGui. import java.awt.textfield; public interface CalculatorGui { public static TextField display = new TextField("0",14);;
Άσκηση 12.6 7 } Η κλάση MyCalculatorGui έχει ένα δηµιουργό που δέχεται ένα όρισµα που κάνει implements το interface Operand. Την αναφορά αυτή χρησιµοποιεί το στιγµιότυπο της κλάσης MyCalculatorGui για να επικοινωνήσει µε το συγκεκριµένο στιγµιότυπο της Operand αποστέλλοντας του κατάλληλα µηνύµατα σε απόκριση της δράσης του χρήστη επί της γραφικής διεπαφής. Επιπλέον σας δίνεται το interface Operand το οποίο αξιοποιήθηκε στην ανάπτυξη της κλάσης MyCalculatorGui. Θα πρέπει η κλάση που θα ορίσετε για τον operand να κάνει implements το interface αυτό. public interface Operand { public void adddigit(char ch); public void deletelastdigit(); public void reset(); public void set(double val); public void complete(); public void setcalculatorgui(calculatorgui cg); } Στο αρχείο CalcGuiV1usingInterfacesExer6.zip σας δίνονται οι κλάσεις που απαιτούνται για την ανάπτυξης της αριθµοµηχανής µε την προσέγγιση αυτή. Εναλλακτικά χρησιµοποιήστε το αρχείο CalcGuiV1usingInterfacesExer6.jar. H παραπάνω πρόταση δεν αντιµετωπίζει τον περιορισµό της δραστηριότητας 1 µε το όνοµα του προγράµµατος. ώστε µια εναλλακτική πρόταση χωρίς τον περιορισµό αυτό.