ΑΛΛΗΛΕΠΙ ΡΑΣΗ ΑΝΘΡΩΠΟΥ ΜΗΧΑΝΗΣ 2 o ΕΡΓΑΣΤΗΡΙO O δικός μας Calculator jtextbox1 με δεξί κλικ αλλαγή ονόματος σε calcbox Το πρώτο πρώτο, που θα κάνετε στην φόρμα σας είναι να αλλάξετε LAYOUT Μετά φτιάξτε σωστά ένα κουμπί π.χ. το 7, και αντιγράψτε το, όσες φορές απαιτείται Properties Accessories/Windows Calculator (View Standard) Ερωτήματα 1-5 (σχεδιαστικά) Fonts Font Style bold & Size σε όλα 18 εκτός του calcbox, που έχει Size 20. Color: Μαύρο: Κόκκινο: Layout manager: GridBagLayout (με δεξί κλικ στο frame) https://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html Ο GridBagLayout είναι ένας εξελιγμένος ευέλικτος διαχειριστής διάταξης (Layout manager). Ευθυγραμμίζει τα συστατικά τοποθετώντας τα σε ένα πλέγμα κελιών, επιτρέποντας σε ένα συστατικό να καλύπτει περισσότερα από ένα κελί. Διαφέρει από τον GridLayout αφού οι σειρές και οι στήλες του πλέγματος μπορεί να έχουν διαφορετικό μέγεθος.κατόπιν μπορούν να αλλαχθούν με την βοήθεια του Customize Layout VK -19/10/2016 - [1]
Absolute Layout Αν και είναι δυνατό να σχεδιάσουμε χωρίς διαχειριστή διάταξης (Absolute Positioning), καλό είναι να χρησιμοποιούμε κάποιον, μιας και ένας διαχειριστής διάταξης κάνει ευκολότερες τις προσαρμογές, ώστε να εμφανίζονται τα συστατικά ανεξάρτητα των αλλαγών π.χ. αλλαγές σε μεγέθη γραμματοσειρών, αλλαγές του μεγέθους του container, αλλαγές περιοχών. Ένας διαχειριστής διάταξης μπορεί να επαναχρησιμοποιηθεί επίσης εύκολα από άλλους containers, όπως επίσης και άλλα προγράμματα. Εάν ένας container περιέχει συστατικά των οποίων το μέγεθος δεν επηρεάζεται από το μέγεθος του, ή το μέγεθος της γραμματοσειράς, ή τις αλλαγές της γλώσσας, τότε η Absolute Positioning (απόλυτη τοποθέτηση) έχει νόημα. GridBagLayout + Customize Layout Mε δεξί κλικ στην επικεφαλίδα (γραμμή ή στήλη) μπορούμε να εισάγουμε/διαγράψουμε γραμμές κτλ. Το κάθε component (π.χ. το jbuttonc) τοποθετείται σε συγκεκριμένη σειρά (Grid Υ:1 η ) και στήλη (Grid Χ:3 η ). Tο κουμπί Power (πιάνει 3 κελιά) έχει GridWidth=3 και Fill=Horizontal, το κουμπί C (πιάνει 1 κελί) έχει GridWidth=1, ενώ το calcbox (πιάνει 4 κελιά) και έχει GridWidth=4. Ερώτημα 6 ( jbuttonpower : όλα τα άλλα κουμπιά enabled/disabled ) Στο κουμπί jbuttonpower θα μπουν οδηγίες της μορφής: if ( jbutton1.isenabled() ) //ή μπορώ να έχω μια μεταβλητή ελέγχου: if ( ispowerpressed ) { jbuttonnum1.setenabled(false); // } else { jbuttonnum1.setenabled(true); } Mιας και τα κουμπιά θα «αναβοσβύνουν» όλα μαζί ο έλεγχος αν ένα από αυτά (jbutton1.isenabled() ) είναι «αναμμένο» αρκεί για όλα τα κουμπιά Το κουμπί «power» θα λειτουργεί σαν διακόπτης για τα υπόλοιπα (17) κουμπιά καθώς και το calcbox δηλ. όταν πατάμε το power, αν αυτά είναι αναμμένα (enabled) θα σβήνουν (γίνονται disabled) και το αντίστροφο. Το «power» θαναι ΠΑΝΤΑ enabled. Προγραμματιστικά, τα κουμπιά μπορούν Ή ένα ένα ονομαστικά να ανάψουν/κλείσουν (κύττα και το παράδειγμα της Οracle components-buttondemoproject.zip Ή να χρησιμοποιηθεί ένα loop για όλα τα components (σύνολο 19) https://docs.oracle.com/javase/tutorial/uiswing/examples/components/index.html#table VK -19/10/2016 - [2] Component c; for (int i=0;i<19 ;i++) { c=getcontentpane().getcomponent(i); if (!c.getname().equals("power")) if (c.isenabled()) c.setenabled(false); else c.setenabled(true); }
Ερώτημα 7 ( jbuttonc ) calcbox.settext(null); //ή και με calcbox.settext(""); Θα εντοπίσετε στα επόμενα ερωτήματα, ποιες μεταβλητές θα πρέπει να αρχικοποιηθούν, αλλά πιθανώς να χρειαστούν οι αριθμοί και η πράξη εκτέλεσης που θα γίνει μεταξύ τους. Ερώτημα 9 (calcbox) Ερώτημα 8 ( jbuttonn0,, jbuttonn9 ) Ενας αριθμός «φτιάχνεται» επιμηκυνόμενος πατώντας τους αριθμούς 0..9. Πρέπει λοιπόν σε κάθε κουμπί jbuttonn0.. jbuttonn9, να μπει η οδηγία «επιμήκυνσης» του αριθμού π.χ. αν πατήσω το 3 θάχω: calcbox.settext(calcbox.gettext()+"3"); //ότι έχω ήδη πατήσει, και προσθέτω/επαυξάνω με 3 (Yπάρχουν προσεγγίσεις με Πίνακα ή χωρίς Πίνακα (για τα κουμπιά 0..9). Στην 2 η περίπτωση (δηλ. χωρίς πίνακα) αν θέλω με τα κουμπιά (0..9) μια σειρά από συγκεκριμένες ενέργειες, καλό θα ήταν να χρησιμοποιήσω μια μέθοδο της μορφής πχ: private void pressednumber(char c) {..} για να μην έχω επαναλαμβανόμενο κώδικα και την καλώ π.χ. από το κουμπί 3 ως pressednumber ('3');) Γενική Λειτουργία Calculator (aποτέλεσμα πράξης - ερώτημα 12) Ο 1 ος αριθμός θα «φτιάχνεται/επιμηκύνεται» μέχρι να πατηθεί ένα κουμπί πράξης π.χ.( +,-,*,/ ). Τότε θα ολοκληρωθεί ο 1 ος αριθμός και θα πρέπει 1) να σωθεί ο 1 ος αριθμός 2) να αδειάσει το calcbox ώστε να μπει ο 2 ος αριθμός 3) να κρατηθεί η πράξη (ώστε όταν θα πατηθεί το =, να εκτελεστεί) Όταν θα πατηθεί το κουμπί εκτέλεσης της πράξης, δηλ. το = τότε θα ολοκληρωθεί ο 2 ος αριθμός και θα πρέπει 1) να σωθεί ο 2 ος αριθμός 2) να γίνει η κατάλληλη πράξη ανάμεσα στους αριθμούς (δηλ. πρόσθεση,αφαίρεση ) 3) να εμφανιστεί στο calcbox το αποτέλεσμα της πράξης. και θα προστεθούν και κάποιες άλλες λεπτομέρειες, όπως ο αριθμός να είναι δεκαδικός (.), να έχει δοθεί ένας μόνο αριθμός κτλ. Ερώτημα 10 (jbutton dot. ) Απαιτείται μια μεταβλητή ελέγχου αν προστέθηκε υποδιαστολή (.) ή όχι πχ private boolean dotwillbepressed=true; Με το πάτημα του κουμπιού jbuttondot ελέγχεται αν θα εισαχθεί υποδιαστολή: if ( dotwillbepressed ) για να προστεθεί στο αριθμό που δημιουργείται μέσα στο calcbox και για να γίνει το dotwillbepressed false ώστε να μην ξαναπατηθεί dot στον ίδιο αριθμό πάλι. (βλέπε και ερωτήματα 8 & 7) VK -19/10/2016 - [3]
Ερώτημα 11 (jbuttons +,-,*,/) Τα τέσσερα κουμπιά των πράξεων θα πρέπει να υλοποιούν τις αντίστοιχες πράξεις Για όλες τις πράξεις απαιτούνται οι (γενικές) μεταβλητές : private double number1=0, number2=0, result=0; αλλά και μια μεταβλητή ελέγχου του είδους λειτουργίας/πράξης/action (+,-,*,/) private char action; (+) Με το πάτημα του κουμπιού + αφού έχει εισαχθεί ο 1 ος αριθμός (number1) θα ΠΡΕΠΕΙ 1. να κρατηθεί ο 1 ος αριθμός, που υπάρχει στο calcbox (θα γίνει μετατροπή από String σε δεκαδικό) number1=double.parsedouble(calcbox.gettext()); 2. να αδειάσει το calcbox ώστε να εισαχθεί ο επόμενος αριθμός (number2) calcbox.settext(null); 3. να σημειωθεί ότι η πράξη που θα γίνει θα είναι η πρόσθεση action= '+' ; ώστε αυτό να ελεχθεί όταν πατηθεί το ίσον ( δηλ. ΣΤΟ ΚΟΥΜΠΙ ίσον, θα μπει κάποια οδηγία της μορφής πχ if ( action=='+') //ή και με χρήση switch (action){ case '+': } result=number1 + number2; //.. αντίστοιχα για τις άλλες πράξεις //ή και Double.valueOf(result); ) 4. να δοθεί τιμή στο dotwillbepressed τιμή true ώστε να μπορεί να μπει και στο 2 ο αριθμό dot. Παρόμοιο με το (+) θα είναι και το κουμπί των άλλων πράξεων. Θα μπορούσε και να γίνει μια μέθοδος για τις 4 πράξεις πχ. private void pressedaction(action a) {..} για να μην έχω επαναλαμβανόμενο κώδικα και να την καλώ π.χ. ως pressedaction ('+'); Ερώτημα 12 (jbuttonequal =) Mε το πάτημα του κουμπιού = θα γίνει η πράξη και το αποτέλεσμα θα εμφανιστεί στο calcbox (η πράξη θα έχει κρατηθεί στη μεταβλητή action και αφορά τους δυο αριθμούς, ο 1 ος είναι ο number1, και ο 2 ος αριθμός θα βρίσκεται στο calcbox). Ετσι στο = θα πρέπει Να κρατηθεί ο 2 ος αριθμός number2=double.parsedouble(calcbox.gettext()); Να γίνει η ζητούμενη πράξη, π.χ. αν action ισούται '+' τότε result =number1 + number2; // Να μπεί στο calcbox το αποτέλεσμα και μετά να μπορέσει να γίνει στο calculator η επόμενή μας πράξη Aρα όταν έχουμε =, θα συνδυάσουμε όλα τα παραπάνω, με τα ζητούμενα που είναι: VK -19/10/2016 - [4]
Το κείμενο του calcbox να γίνει ίσο με a. 0, αν πατηθεί το ίσον (=), πριν την εισαγωγή κάποιου αριθμού (αν number1 και calcbox.settext("0"); b. Με τον πρώτο αριθμό που εισήχθη, εάν μετά το πάτημα ενός συμβόλου πράξης (+,-,*,/) πατηθεί το ίσον (=) χωρίς εισαγωγή άλλου αριθμού: Ο έλεγχος (calcbox.gettext().isempty()) ή (calcbox.gettext().equals("")) για το αν υπάρχει ή όχι αριθμός στο calcbox, πρέπει να γίνει ( γιατί αλλιώς θα χτυπάει η μετατροπή το Double) πχ: if ( (calcbox.gettext().isempty()) ) calcbox.settext(double.tostring(number1)) c. ένα μήνυμα λάθους π.χ. ERROR, αν στην διαίρεση ο δεύτερος αριθμός είναι το 0, if ( action=='/' ) if ( number2!= 0 ) { result = number1 / number2; } else calcbox.settext("error!!!"); d. Tο αποτέλεσμα της πράξης, σε όλες τις άλλες περιπτώσεις Ερώτημα 13 Να προγραμματιστεί το πλήκτρο <ENTER> του πληκτρολογίου ώστε να έχει την ίδια λειτουργία με το ίσον. (η παρακάτω εντολή πρέπει να μπει μέσα στο δομητή) getrootpane().setdefaultbutton(jbuttonequal); Root Panes : Αν και ποτέ δεν δημιουργούμε άμεσα ένα αντικείμενο jrootpane, αυτό δημιουργείται έμμεσα όταν αρχικοποιείται ένα jinternalframe ή έναs container Swing υψηλού επιπέδου, όπως japplet, jdialog, και jframe http://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html Με την εντολή getrootpane().setdefaultbutton(κουμπιπουθελω) θέτουμε ως εξ ορισμού κουμπί για το jrootpane, το κουμπιπουθελω (δηλ. το=). Tο default κουμπί θα ενεργοποιείται όταν πατιέται το <Enter>. Ένα πρόγραμμα calculator βρίσκεται στο ακόλουθο link: http://www.wideskills.com/java-tutorial/java-swingcalculator VK -19/10/2016 - [5]