1 1 Προγραμματισμός ΙΙ Η γλώσσα αντικειμενοστραφούς προγραμματισμού Java ∆ιδάσκων – ∆ημήτριος Κατσαρός, Ph.D. @ Τμ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ∆ικτύων Πανεπιστήμιο Θεσσαλίας ∆ιάλεξη 11η: 28/08/2006 2 ∆ιασύνδεση με χρήστη: Swing ΙΙ Creating User Interfaces: Swing ΙΙ Τμ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ∆ικτύων, Πανεπιστήμιο Θεσσαλίας 3 Window Listeners • Κάνοντας click στο κουμπί close-window σε ένα JFrame ενεργοποιείται ένα γεγονός παραθύρου (window event) • Τα window events είναι αντικείμενα της κλάσης WindowEvent • Η μέθοδος setWindowListener μπορεί να συσχετίσει (register) ένα window listener για κάποιο window event • Ένας window listener μπορεί να προγραμματιστεί ώστε ν’ αποκρίνεται σε αυτόν τον τύπο γεγονότος • Ένας window listener είναι μια οποιαδήποτε κλάση που ικανοποιεί/υλοποιεί τη διεπαφή (interface) WindowListener
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Window Listeners• Κάνοντας click στο κουµπί close-window σε έναJFrame ενεργοποιείται ένα γεγονός παραθύρου(window event)• Τα window events είναι αντικείµενα της κλάσηςWindowEvent
• Η µέθοδος setWindowListener µπορεί νασυσχετίσει (register) ένα window listener γιακάποιο window event• Ένας window listener µπορεί να προγραµµατιστείώστε ν’ αποκρίνεται σε αυτόν τον τύπο γεγονότος
• Ένας window listener είναι µια οποιαδήποτε κλάσηπου ικανοποιεί/υλοποιεί τη διεπαφή (interface)WindowListener
A Window Listener Inner Class• Μια εσωτερική κλάση (inner class) συχνάλειτουργεί ως window listener για ένα JFrame• Το επόµενο παράδειγµα χρησιµοποιεί µια window
listener inner class µε όνοµα CheckOnExitaddWindowListener(new CheckOnExit());
• Όταν γίνει click στο κουµπί close-window toy κυρίου παραθύρου, ενεργοποιείται ένα window event• Αυτό λαµβάνεται από το anonymous window
listener αντικείµενο• Αυτό προκαλεί την ενεργοποίηση της µεθόδουwindowClosing
A Window Listener Inner Class• Η µέθοδος windowClosing δηµιουργεί και απεικονίζει ένααντικείµενο της κλάσης ConfirmWindow• Περιέχει το µήνυµα "Are you sure you want to exit?"όπως επίσης και τα κουµπιά "Yes" και "No"
• Εάν ο χρήστης κάνει click στο "Yes," το action event πουενεργοποιείται λαµβάνεται από τη µέθοδοactionPerformed• Τερµατίζει το πρόγραµµα µε µια κλήση στη µέθοδο System.exit
• Εάν ο χρήστης κάνει click στο "No," η µέθοδοςactionPerformed ενεργοποιεί τη µέθοδο dispose• Αυτό προκαλεί την αποµάκρυνση του καλούντος αντικειµένου (δηλ., το
µικρό παράθυρο της κλάσης ConfirmWindow), αλλά δεν επηρεάζει τοκυρίως παράθυρο
• Η µέθοδος dispose της κλάσης JFrameχρησιµοποιείται για να απαλείψουµε το JFrameχωρίς να τερµατίσουµε το πρόγραµµα• Οι πόροι του υπολογιστή που καταναλώνονται απόαυτό το JFrame και τις συνιστώσες τουεπιστρέφονται για χρήση ξανά στο σύστηµα
• Εκτός εάν απαλειφθούν όλα τα στοιχεία (δηλ., σε έναπρόγραµµα µε ένα παράθυρο), η παραπάνω µέθοδοςδεν τερµατίζει το πρόγραµµα
• Η dispose χρησιµοποιείται συχνά σε έναπρόγραµµα µε πολλαπλά παράθυρα για ναεξαλείψουµε κάποιο παράθυρο χωρίς νατερµατίζουµε το πρόγραµµα
Παγίδα: Παραλείποντας την ενεργοποίηση τηςsetDefaultCloseOperation
• Η συµπεριφορά που καθορίζεται από τηνsetDefaultCloseOperation λαµβάνειχώρα ακόµα και εάν υπάρχει κάποιος window listener συσχετισµένος (registered) µε τοJFrame• Οποτεδήποτε κάποιος window listener συσχετίζεται
(registered) ώστε ν’ αποκρίνεται σε window events, πρέπει να περιλαµβάνεται µια ενεργοποίησητης setDefaultCloseOperation
• Αυτή η ενεργοποίηση γίνεται συνήθως µέσα στονJFrame constructor
Παγίδα: Παραλείποντας την ενεργοποίηση τηςsetDefaultCloseOperation
• Εάν ο window listener λαµβάνει µέριµνα όλης τηςσυµπεριφοράς του παραθύρου, τότε ο JFrameconstructor πρέπει να περιέχει το ακόλουθο:setDefaultCloseOperation(
JFrame.DO_NOTHING_ON_CLOSE)• Εάν αυτή η δήλωση δεν συµπεριλαµβάνεται, η επόµενηεξ’ ορισµού ενέργεια θα λάβει χώρα, ανεξάρτητα από τοεάν κάποιος window listener υποτίθεται ότι λαµβάνειµέριµνα γι’ αυτό:
setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);• Αυτή η δήλωση θα κρύψει το JFrame , αλλά δεν θα τερµατίσει τοπρόγραµµα
• Όταν µια κλάση δεν παρέχει πραγµατικέςυλοποιήσεις για τις περισσότερες από τις µεθόδουςτου interface WindowListener, είναι καλύτερανα την κάνουµε παραγόµενη κλάση της κλάσηςWindowAdapter• Μόνο οι κεφαλίδες µεθόδων, που χρησιµοποιούνται, πρέπει να οριστούν
• Οι άλλες κεφαλίδες µεθόδων κληρονοµούν τετριµµένεςυλοποιήσεις από την WindowAdapter, και έτσι δενυπάρχει ανάγκη για κενά σώµατα µεθόδων
• Αυτό µπορεί να γίνει µόνο όταν η JFrame δενχρειάζεται να παραχθεί (derived) από κάποια άλληκλάση
Εικονίδια - Icons• Η κλάση ImageIcon χρησιµοποιείται για να
µετατρέψουµε µια εικόνα σε ένα Swing iconImageIcon dukeIcon = new ImageIcon("duke_waving.gif");
• Το αρχείο εικόνας πρέπει να βρίσκεται στο ίδιοdirectory όπως και η κλάση στην οποία εµφανίζεται οκώδικας, εκτός και εάν δίνουµε ένα πλήρες ή σχετικόµονοπατιού
• Σηµειώστε ότι το όνοµα του αρχείου εικόνας δίνεταιως string
• Ένα icon µπορεί να προστεθεί σε µια label µε χρήση τηςµεθόδου setIcon ως ακολούθως:JLabel dukeLabel = new JLabel("Mood check");dukeLabel.setIcon(dukeIcon);
• Αντί γι’ αυτό, ένα icon µπορεί να δοθεί ως όρισµα στονconstructor µιας JLabel:JLabel dukeLabel = new JLabel(dukeIcon);
• Μπορεί να προστεθεί και κείµενο σε µια label µε χρήστητης µεθόδου setText:dukeLabel.setText("Mood check");
• Τα icons και το κείµενο µπορεί να προστεθούν σεJButtons και JMenuItems µε τον ίδιο τρόπο όπωςπροστίθενται σε ένα JLabelJButton happyButton = new JButton("Happy");ImageIcon happyIcon = new
• Τα button ή menu items µπορεί να δηµιουργηθούν µεµόνο ένα icon δίνοντας το αντικείµενο ImageIcon ωςόρισµα στον constructor JButton ή JMenuItemImageIcon happyIcon= new ImageIcon("smiley.gif");JButton smileButton= new JButton(happyIcon);JMenuItem happyChoice= new JMenuItem(happyIcon);
• Ένα button ή menu item που δηµιουργείται χωρίς text θαπρέπει να χρησιµοποιεί τη µέθοδο setActionCommand για ναθέτει ρητά την εντολή ενέργειας, αφού δεν υπάρχει string
• Τα αντικείµενα της κλάσης Insetsχρησιµοποιούνται για να καθορίζουν το µέγεθοςτου περιθωρίου σε ένα button ή menu item• Τα ορίσµατα που δίνονται όταν δηµιουργείται ένααντικείµενο της κλάσης Insets είναι σε pixels
• Η κλάση Insets βρίσκεται στο package java.awt
public Insets(int top, int left, int bottom, int right)
• Όταν δηµιουργείται µια text area, ο αριθµόςτων γραµµών που είναι ορατές και ο αριθµός τωνχαρακτήρων ανά γραµµή καθορίζεται ως εξής:JTextArea memoDisplay = new
JTextArea(15, 30);
• Όµως, είναι συχνά καλύτερο να µην χρειάζεταινα θέτουµε ένα σταθερό όριο στον αριθµό τωνγραµµών ή των χαρακτήρων ανά γραµµή• Αυτό µπορεί να γίνει µε χρήση των scroll bars στην
• Όταν χρησιµοποιούµε scroll bars, το κείµενοεικονίζεται διαµέσου ενός view port που δείχνειµόνο ένα τµήµα του κειµένου κάθε φορά• Ένα διαφορετικό τµήµα του κειµένου µπορεί νααπεικονιστεί µε χρήση των scroll bars πουτοποθετούνται κατά µήκος της πλευράς και της κάτωπλευράς της view port
• Οι scroll bars µπορεί να προστεθούν σε text areas µε χρήση της κλάσης JScrollPane• Η κλάση JScrollPane βρίσκεται στο packagejavax.swing
• Ένα αντικείµενο της κλάσης JScrollPane είναιόπως ένα view port µε scroll bars
• Εάν παραληφθούν οι ενεργοποιήσεις αυτών των µεθόδων, τότεοι scroll bars θα είναι ορατές µόνο εάν χρήσιµες• Εάν όλο το κείµενο χωράει στο view port, τότε οι scroll bars δεν θαείναι ορατές
• Εάν προστεθεί αρκετό κείµενο, οι scroll bars θα εµφανιστούν αυτόµατα
• Όταν σχεδιάζουµε αντικείµενα στην οθόνη, ηJava χρησιµοποιεί ένα σύστηµα συντεταγµένωνόπου η αρχή, δηλ., το σηµείο (0,0) είναι στηνπάνω-αριστερή γωνία της οθόνης• Η x-συντεταγµένη (οριζόντια) είναι θετική καιαυξάνει προς τα δεξιά
• Η y-συντεταγµένη (κατακόρυφη) είναι θετική καιαυξάνει προς τα κάτω
• Όλες οι συντεταγµένες είναι κανονικά θετικές• Οι µονάδες και τα µεγέθη είναι σε pixels• Η περιοχή που χρησιµοποιείται για τη σχεδίαση είναιένα JFrame ή JPanel
Σύστηµα συντεταγµένων για τα αντικείµεναγραφικών• Το σηµείο (x,y) βρίσκεται x pixels από τηναριστερή ακµή της οθόνης, και y pixels προς τακάτω, από την κορυφή της οθόνης
• Όταν τοποθετούµε ένα ορθογώνιο στην οθόνη, καθορίζουµε τη θέση της πάνω-αριστερής γωνίαςτου
• Όταν τοποθετούµε ένα σχήµα, διαφορετικό απόορθογώνιο, στην οθόνη, η Java περικλείει τοσχήµα σε ένα φανταστικό ορθογώνιο, πουαποκαλείται περικλείον κουτί (bounding box),και τοποθετεί την πάνω-αριστερή γωνία αυτούτου ορθογωνίου
• Κάθε container και συνιστώσα που µπορεί νασχεδιαστεί στην οθόνη έχει συσχετισµένο ένααντικείµενο τύπου Graphics• Η κλάση Graphics είναι µια abstract class πουβρίσκεται στο package java.awt
• Αυτό το αντικείµενο έχει δεδοµένα πουκαθορίζουν ποια περιοχή της οθόνης καλύπτεταιαπό τη συνιστώσα ή τον container• Το αντικείµενο Graphics για ένα JFrameκαθορίζει ότι η σχεδίαση γίνεται µέσα από τα όρια τουαντικειµένου JFrame
• Το αντικείµενο g της κλάσης Graphicsµπορεί να χρησιµοποιηθεί ως το καλούναντικείµενο για µια µέθοδο σχεδίασης• Η σχεδίαση θα λάβει χώρα µέσα από την περιοχή τηςοθόνης που καθορίζεται από το g
• Η µέθοδος paint έχει µια παράµετρο g τύπουGraphics• Όταν ενεργοποιείται η µέθοδος paint, το gαντικαθίσταται από το αντικείµενο Graphics πουείναι συσχετισµένο µε το JFrame
• Εποµένως, τα σχήµατα σχεδιάζονται εντός τουJFrame
• Μια έλλειψη (oval) σχεδιάζεται µε τη µέθοδοdrawOval• Τα ορίσµατα καθορίζουν τη θέση, το πλάτος (µεγάλοςάξονας) και το ύψος (µικρός άξονας) του µικρότερουορθογωνίου που περικλείει (το περιγεγραµµένοορθογώνιο) την έλλειψηg.drawOval(100, 50, 300, 200);
• Ένας κύκλος είναι µια ειδική περίπτωση τηςέλλειψης, όπου το πλάτος και το ύψος τουορθογωνίου είναι ίσα
Σχεδιάζοντας Τόξα-Arcs• Τα τόξα καθορίζονται δίνοντας µια έλλειψη, καικατόπιν καθορίζοντας ποιο τµήµα της θαχρησιµοποιηθεί για να περιγράψει το τόξο• Η επόµενη δήλωση σχεδιάζει ένα χαµόγελο σε έναευτυχισµένο πρόσωπο:g.drawArc(X_MOUTH, Y_MOUTH, MOUTH_WIDTH,
MOUTH_HEIGHT, MOUTH_START_ANGLE,MOUTH_ARC_SWEEP);
• Τα ορίσµατα MOUTH_WIDTH και MOUTH_HEIGHTκαθορίζουν το µέγεθος του bounding box, ενώ ταορίσµατα X_MOUTH και Y_MOUTH καθορίζουν τη θέσητου
• Τα τελευταία δυο ορίσµατα καθορίζουν το τµήµα που θαείναι ορατό
“Στρογγυλεµένα” (Rounded) ορθογώνια• Ένα rounded rectangle είναι ένα ορθογώνιο τουοποίου οι γωνίες έχουν αντικατασταθεί από τόξα έτσιώστε οι γωνίες του να είναι στρογγυλεµένες
g.drawRoundRect(x, y, width, height, arcWidth, arcHeight)
• Τα ορίσµατα x, y, width, και height καθορίζουν τοκανονικό οργογώνιο
• Τα τελευταία δυο ορίσµατα arcWidth, καιarcHeight, καθορίζουν τα τόξα που θα χρησιµοποιηθούνγια τις γωνίες
• Κάθε γωνία αντικαθίσταται µε ένα τέταρτο µιας έλλειψης τοοποίο έχει arcWidth pixels πλάτος και arcHeightpixels ύψος
• Όταν τα arcWidth και arcHeight είναι ίσα, οι γωνίεςθα είναι τόξα κύκλων
paintComponent για Panels• Ένα JPanel είναι ένα JComponent, αλλά έναJFrame είναι ένα Component, και όχι έναJComponent• Εποµένως, χρησιµοποιούν διαφορετικές µεθόδουςσχεδίασης στην οθόνη
• Τα σχήµατα µπορούν να σχεδιαστούν σε έναJPanel, και το JPanel µπορεί να τοποθετηθείσε ένα JFrame• Όταν ορίζουµε µια κλάση JPanel µε τον τρόπο αυτό, χρησιµοποιείται η µέθοδος paintComponent αντίτης µεθόδου paint
• Σε κάθε άλλη περίπτωση, οι λεπτοµέρειες είναι ίδιεςόπως εκείνες για ένα JFrame
• Η µέθοδος repaint θα πρέπει ναενεργοποιείται όταν τα γραφικά περιεχόµενα τουπαραθύρου αλλάζουν• Η µέθοδος repaint κάνει κάποια προεργασία, καικατόπιν ενεργοποιεί τη µέθοδο paint, η οποίαξανασχεδιάζει την οθόνη
• Παρόλο που η µέθοδος repaint πρέπει ναενεργοποιείται ρητά, είναι ήδη ορισµένη
• Σε αντίθεση, η µέθοδος paint, πρέπει να ορίζεται, αλλά δεν ενεργοποιείται ρητά
• Στο Swing, οι περισσότερες αλλαγές στο GUI ενηµερώνονται αυτόµατα για να γίνουν ορατές στηνοθόνη• Αυτό γίνεται µε το αντικείµενο repaint manager
• Παρόλο που ο repaint manager λειτουργείαυτόµατα, υπάρχουν µερικές ενηµερώσεις που δεντις εκτελεί• Για παράδειγµα, εκείνες που γίνονται µε τις validateή repaint
• Μια άλλη µέθοδος ενηµέρωσης είναι η pack• Η pack αλλάζει το µέγεθος του παραθύρου στο
• Μια ενεργοποίηση της validate προκαλεί σεέναν container να ξανατοποθετήσει τις συνιστώσεςτου στην οθόνη• Είναι ένα είδος µεθόδου "update" που κάνει τις αλλαγέςστις συνιστώσες να εµφανιστούν στην οθόνη
• Κάθε κλάση container έχει τη δική της µέθοδοvalidate, η οποία δεν δέχεται ορίσµατα
• Πολλές απλές αλλαγές σε ένα Swing GUI συµβαίνουν αυτόµατα, ενώ άλλες απαιτούνενεργοποίηση της validate ή κάποιας άλληςµεθόδου "update"• Όταν υπάρχει αµφιβολία δεν προκαλεί βλάβη ηενεργοποίηση της µεθόδου validate
• Η χρήση της µεθόδου drawLine µέσα σε µιαµέθοδο paint είναι παρόµοια µε τη σχεδίαση µεένα µολύβι το οποίο µπορεί να αλλάζει χρώµατα• Η µέθοδος setColor θα αλλάξει το χρώµα του
µολυβιού σχεδίασης• Το χρώµα που καθορίζεται µπορεί να αλλαχτείαργότερα µε µια άλλη ενεργοποίηση της setColorέτσι ώστε ένα σχέδιο µπορεί να έχει πολλαπλάχρώµαταg.setColor(Color.BLUE)
• Τα standard χρώµατα στην κλάση Color είναιήδη ορισµένα• Αυτά παρατίθενται στην επόµενη διαφάνεια
• Η κλάση Color µπορεί να χρησιµοποιηθεί για ναοριστούν επιπλέον χρώµατα• Χρησιµοποιεί το σύστηµα χρωµάτων RGB, το οποίοχρησιµοποιεί διαφορετικές ποσότητες κόκκινου (red), πράσινου (green), και γαλάζιου (blue) χρώµατος για ναπαράξει οποιοδήποτε χρώµα
• Integers ή floats µπορεί να χρησιµοποιηθούνγια να καθορίσουµε το ποσό του red, green, και/ή blue σε ένα χρώµα• Οι integers πρέπει να βρίσκονται στην περιοχή 0-255
(inclusive)Color brown = new Color(200, 150, 0);
• Οι τιµές float πρέπει να βρίσκονται στην περιοχή0.0-1.0 (inclusive)
Color brown = new Color((float)(200.0/255),(float)(150.0/255), (float)0.0);
Παγίδα: Χρησιµοποιώντας doubles για ναορίσουµε χρώµα
• Οι constructors της κλάσης Color δέχονται µόνοορίσµατα τύπου int ή float• Χωρίς προσαρµογή (cast), αριθµοί όπως 200.0/255, 0.5, και 0.0 θεωρούνται τύπου double, και όχι τύπου float
• ∆εν πρέπει να ξεχνάµε να κάνουµε type cast ότανθέλουµε να χρησιµοποιούµε αριθµούς float• Σηµειώστε ότι αυτοί οι αριθµοί θα πρέπει νααντικαθίστανται από ορισµένες σταθερές (defined constants) σε οποιοδήποτε τελικό κώδικα
• Η κλάση JColorChooser µπορεί ναχρησιµοποιηθεί για να επιτρέψουµε στο χρήστηνα επιλέξει ένα χρώµα
• Η µέθοδος showDialog της κλάσηςJColorChooser παράγει ένα παράθυροεπιλογής χρώµατος• Ο χρήστης µπορεί να επιλέξει ένα χρώµακαθορίζοντας τιµές RGB ή επιλέγοντας από δείγµαταχρωµάτων
sample Color = JColorChooser.showDialog(this,"JColorChooser", sampleColor);
• Η µέθοδος drawString είναι παρόµοια µε τιςµεθόδους σχεδίασης της κλάσης Graphics• Όµως, δείχνει κείµενο και όχι κάποιο σχέδιο• Εάν δεν καθοριστεί το font, χρησιµοποιείται ένα
Τύποι των Font• Κάθε font που είναι διαθέσιµο στο σύστηµα µπορείνα χρησιµοποιηθεί από τη Java• Όµως, η Java εγγυάται ότι τουλάχιστον τρία fonts θαείναι διαθέσιµα : "Monospaced", "SansSerif", και"Serif"
• Τα Serifs είναι µικρές γραµµές που finish off τοτέλος των γραµµών στα γράµµατα• Αυτό το S έχει serifs, αλλά αυτό το S δεν έχει• Ένα "Serif" font έχει πάντα serifs• Το Sans σηµαίνει χωρίς, έτσι το "SansSerif" font δενέχει serifs
• "Monospaced" σηµαίνει ότι όλοι οι χαρακτήρες έχουνίδιο πλάτος