Προγραμματισμός

Χρήση της κατηγορίας γραφικών

Μια ποικιλία παραγόντων εμπνέει τους ανθρώπους να γράφουν προγράμματα λογισμικού. Πιστεύω ότι για πολλούς, το κίνητρο πηγάζει από την επιθυμία δημιουργίας γραφικών, χειρισμού εικόνων ή κινούμενων εικόνων. Είτε θέλουν να δημιουργήσουν παιχνίδια arcade, προσομοιωτές πτήσεων ή πακέτα CAD, οι προγραμματιστές αρχίζουν συχνά να μαθαίνουν να σχεδιάζουν.

Η εργαλειοθήκη γραφικών εντός του Abstract Windowing Toolkit (ή AWT) επιτρέπει σε έναν προγραμματιστή Java να σχεδιάζει απλά γεωμετρικά σχήματα, να εκτυπώνει κείμενο και να τοποθετεί εικόνες μέσα στα όρια ενός στοιχείου, όπως ένα πλαίσιο, πλαίσιο ή καμβά.

Αυτή η στήλη είναι η πρώτη μου στο θέμα των γραφικών. Θα επικεντρωθεί στο Γραφικά τάξη και τις μεθόδους της για τη σχεδίαση απλών γεωμετρικών σχημάτων, και θα εισαγάγει τη διαδικασία με την οποία πραγματοποιείται η ζωγραφική (και η βαφή).

Ας ξεκινήσουμε στο κεντρικό στάδιο - το Γραφικά τάξη.

Η τάξη γραφικών

Είναι σημαντικό οι προγραμματιστές να κατανοήσουν το Γραφικά προτού επιχειρήσουν να σχεδιάσουν εικόνες μέσω Java. ο Γραφικά Η κλάση παρέχει το πλαίσιο για όλες τις λειτουργίες γραφικών εντός του AWT. Παίζει δύο διαφορετικούς, αλλά σχετικούς, ρόλους. Πρώτον, είναι το πλαίσιο γραφικών. Το πλαίσιο γραφικών είναι πληροφορίες που θα επηρεάσουν τις λειτουργίες σχεδίασης. Αυτό περιλαμβάνει τα χρώματα φόντου και προσκηνίου, τη γραμματοσειρά και τη θέση και τις διαστάσεις του ορθογωνίου αποκοπής (η περιοχή ενός στοιχείου στο οποίο μπορούν να σχεδιαστούν γραφικά). Περιλαμβάνει ακόμη και πληροφορίες σχετικά με τον τελικό προορισμό των ίδιων των γραφικών (οθόνη ή εικόνα). Δεύτερον, το Γραφικά Η κλάση παρέχει μεθόδους σχεδίασης απλών γεωμετρικών σχημάτων, κειμένου και εικόνων στον προορισμό των γραφικών. Όλη η έξοδος προς τον προορισμό γραφικών πραγματοποιείται μέσω επίκλησης μίας από αυτές τις μεθόδους.

Για να σχεδιάσετε, ένα πρόγραμμα απαιτεί ένα έγκυρο περιβάλλον γραφικών (που αντιπροσωπεύεται από μια παρουσία του Γραφικά τάξη). Επειδή η Γραφικά Η κλάση είναι μια αφηρημένη βασική τάξη, δεν μπορεί να δημιουργηθεί άμεσα. Μια παρουσία δημιουργείται συνήθως από ένα στοιχείο και παραδίδεται στο πρόγραμμα ως επιχείρημα σε ένα στοιχείο εκσυγχρονίζω() και χρώμα() μεθόδους. Αυτές οι δύο μέθοδοι, μαζί με το χρωματίζω πάλι() μέθοδος, συζητούνται στην επόμενη ενότητα.

Οι μέθοδοι

Οι ακόλουθες τρεις μέθοδοι εμπλέκονται στην εμφάνιση γραφικών. Οι προεπιλεγμένες εκδόσεις κάθε παρέχονται ανά τάξη Συστατικό. Μέθοδοι εκσυγχρονίζω() και χρώμα() πρέπει να επαναπροσδιοριστεί για την εκτέλεση των επιθυμητών λειτουργιών γραφικών.

χρωματίζω πάλι()

δημόσιο βάψιμο κενού () δημόσιο βάψιμο κενού (μακρύ tm) δημόσιο βάψιμο κενού (int x, int y, int w, int h) δημόσιο void repaint (long tm, int x, int y, int w, int h)

ο χρωματίζω πάλι() Η μέθοδος ζητά να επαναβαφτεί ένα στοιχείο. Ο καλών μπορεί να ζητήσει να γίνει επαναβαφή το συντομότερο δυνατό ή να καθορίσει μια χρονική περίοδο σε χιλιοστά του δευτερολέπτου. Εάν έχει καθοριστεί μια χρονική περίοδος, η διαδικασία βαφής θα πραγματοποιηθεί πριν παρέλθει η χρονική περίοδος. Ο καλών μπορεί επίσης να καθορίσει ότι μόνο ένα μέρος ενός στοιχείου θα ξαναβαφτεί. Αυτή η τεχνική είναι χρήσιμη εάν η λειτουργία βαφής είναι χρονοβόρα και μόνο ένα μέρος της οθόνης χρειάζεται επαναβαφή. Ο κωδικός στην Λίστα 1 απεικονίζει πώς το χρωματίζω πάλι() μέθοδος μπορεί να χρησιμοποιηθεί σε ένα πρόγραμμα.

boolean mouseDown (Event e, int x, int y) {select_object.move (x, y); χρωματίζω πάλι(); }

Λίστα 1: Χειριστής συμβάντων με ποντίκι προς τα κάτω

Ο κωδικός στο mouseDown () Το event handler υπολογίζει εκ νέου τη θέση ενός αντικειμένου σε μια οθόνη με βάση τη θέση του ποντικιού και καλεί το χρωματίζω πάλι() μέθοδος για να δείξει ότι η οθόνη πρέπει να ξαναβαφτεί το συντομότερο δυνατό.

εκσυγχρονίζω()

δημόσια ακύρωση ενημέρωσης (Γραφικά g)

ο εκσυγχρονίζω() η μέθοδος καλείται ως απόκριση σε ένα χρωματίζω πάλι() αίτημα ή ως απόκριση ενός τμήματος του στοιχείου που αποκαλύφθηκε ή εμφανίστηκε για πρώτη φορά. Το μοναδικό επιχείρημα της μεθόδου είναι μια παρουσία του Γραφικά τάξη. ο Γραφικά Το παράδειγμα ισχύει μόνο στο πλαίσιο του εκσυγχρονίζω() μέθοδο (και οποιεσδήποτε μεθόδους καλεί), αλλά απορρίπτεται αμέσως μετά το εκσυγχρονίζω() επιστρέφει η μέθοδος. Η προεπιλεγμένη εφαρμογή που παρέχεται από το Συστατικό τάξη σβήνει το φόντο και καλεί το χρώμα() μέθοδος (παρακάτω).

χρώμα()

δημόσιο κενό χρώμα (Γραφικά g)
ο χρώμα() η μέθοδος καλείται από ένα εκσυγχρονίζω() μέθοδος και είναι υπεύθυνη για την πραγματική σχεδίαση των γραφικών. Το μοναδικό επιχείρημα της μεθόδου είναι μια παρουσία του Γραφικά τάξη. Η προεπιλεγμένη εφαρμογή παρέχεται από την τάξη Συστατικό δεν κάνει τίποτα. 

Πώς χρωματίζονται τα συστατικά

Για να μειώσετε το χρόνο που απαιτείται για να βάψετε ξανά την οθόνη, το AWT παίρνει δύο συντομεύσεις:

  • Πρώτον, το AWT ξαναβάφει μόνο εκείνα τα στοιχεία που χρειάζονται βαφή, είτε επειδή έχουν αποκαλυφθεί είτε επειδή ζήτησαν να ξαναβαφτεί.

  • Δεύτερον, εάν ένα στοιχείο καλύφθηκε και αποκαλυφθεί, το AWT βάφει μόνο το τμήμα του στοιχείου που είχε προηγουμένως καλυφθεί.

Η μικροεφαρμογή στο Σχήμα 1 σας επιτρέπει να παρατηρήσετε αυτήν τη διαδικασία καθώς συμβαίνει. Αγνοήστε την περιοχή κειμένου στο επάνω μέρος της μικροεφαρμογής για μια στιγμή και παρακολουθήστε μόνο το έγχρωμο τμήμα της οθόνης. Χρησιμοποιώντας άλλο παράθυρο, καλύψτε στιγμιαία και, στη συνέχεια, αποκαλύψτε μέρος της μικροεφαρμογής. Σημειώστε ότι μόνο το τμήμα της μικροεφαρμογής που καλύπτεται ξαναβάφεται. Επιπλέον, μόνο τα συστατικά που καλύπτονται ξαναβαφίζονται, ανεξάρτητα από τη θέση τους στην ιεραρχία συστατικών. Χρησιμοποιώντας σκόπιμα διαφορετικά χρώματα, η μικροεφαρμογή καθιστά αυτό το λεπτό αποτέλεσμα αισθητό. Ο πηγαίος κώδικας για αυτό το σχήμα είναι διαθέσιμος εδώ.

Εικόνα 1: Επαναβαφή προγράμματος περιήγησης

Το σύστημα συντεταγμένων γραφικών

Οι μέθοδοι που περιγράφονται στην ακόλουθη ενότητα λαμβάνουν, ως παράμετροι, τιμές που καθορίζουν τον τρόπο σχεδίασης ενός σχήματος. Για παράδειγμα, το drawLine () Η μέθοδος αναμένει τέσσερις παραμέτρους. Οι δύο πρώτες παράμετροι καθορίζουν τη θέση της έναρξης της γραμμής και οι δύο τελευταίες παράμετροι καθορίζουν τη θέση του τέλους της γραμμής. Οι ακριβείς τιμές που πρέπει να μεταβιβαστούν στο drawLine () Η μέθοδος καθορίζεται από το σύστημα συντεταγμένων που ισχύει.

Ένα σύστημα συντεταγμένων είναι μια μέθοδος για τον σαφή προσδιορισμό της θέσης των σημείων στο διάστημα. Στην περίπτωση του AWT, αυτός ο χώρος είναι μια δισδιάστατη επιφάνεια που ονομάζεται επίπεδο. Κάθε θέση σε ένα επίπεδο μπορεί να προσδιοριστεί από δύο ακέραιους, που ονομάζεται Χ και γ συντεταγμένες. Οι τιμές του Χ και γ Οι συντεταγμένες υπολογίζονται με βάση την αντίστοιχη οριζόντια και κατακόρυφη μετατόπιση του σημείου από την προέλευση. Στην περίπτωση του AWT, η προέλευση είναι πάντα το σημείο στην επάνω αριστερή γωνία του επιπέδου. Έχει τις τιμές συντεταγμένων 0 (για Χ) και 0 (για γ). Η εικόνα στο Σχήμα 2 δείχνει δύο σημεία - ένα βρίσκεται στην αρχή και ένα άλλο βρίσκεται στη θέση επτά και πέντε κάτω από την προέλευση.

Εικόνα 2: Το επίπεδο συντεταγμένων

Τα πρωτόγοντα γραφικών

Αυτή η ενότητα εισάγει μεθόδους σχεδίασης γραμμών, ορθογωνίων, ωοειδών και τόξων και πολυγώνων. Δεδομένου ότι αυτές οι μέθοδοι λειτουργούν μόνο όταν επικαλούνται ένα έγκυρο Γραφικά Για παράδειγμα, μπορούν να χρησιμοποιηθούν μόνο εντός του πεδίου των στοιχείων εκσυγχρονίζω() και χρώμα() μεθόδους. Οι περισσότερες από τις μεθόδους που ακολουθούν έρχονται σε ζεύγη. Μία μέθοδος (η drawX () μέθοδος) σχεδιάζει μόνο το περίγραμμα του καθορισμένου σχήματος και την άλλη μέθοδο (το fillX () μέθοδος) σχεδιάζει μια γεμάτη έκδοση του καθορισμένου σχήματος.

γραμμές

void drawLine (int xBegin, int yBegin, int xEnd, int yEnd)

Αυτή είναι η απλούστερη από όλες τις μεθόδους γραφικών. Σχεδιάζει μια ευθεία γραμμή, πλάτους ενός εικονοστοιχείου, μεταξύ των καθορισμένων σημείων έναρξης και λήξης. Η γραμμή που προκύπτει θα περικοπεί ώστε να χωράει στα όρια της τρέχουσας περιοχής αποκοπής. Η γραμμή θα σχεδιαστεί με το τρέχον χρώμα προσκηνίου.

Η μικροεφαρμογή στο Σχήμα 3 δείχνει το drawLine () μέθοδος σε δράση. Ο πηγαίος κώδικας είναι διαθέσιμος εδώ. Αυτή η μικροεφαρμογή και οι μικροεφαρμογές στα Σχήματα 4, 6 και 7 απαιτούν τις υπηρεσίες δύο κατηγοριών υποστήριξης: της κλάσης NewCanvas και της διεπαφής Figure. Η τάξη NewCanvas επεκτείνει την κατηγορία Canvas και παρέχει μια εξειδικευμένη επιφάνεια σχεδίασης για φιγούρες. Ο πηγαίος κώδικας για την τάξη NewCanvas είναι διαθέσιμος εδώ. Η διεπαφή Figure καθορίζει τις μεθόδους που πρέπει να παρέχει ένα σχήμα για να χρησιμοποιηθεί με το NewCanvas. Ο πηγαίος κώδικας για τη διεπαφή σχήματος είναι διαθέσιμος εδώ.

Εικόνα 3: Επίδειξη γραμμικών σχεδίων

ορθογώνια
void drawRect (int x, int y, int w, int h) void fillRect (int x, int y, int w, int h) void drawRoundRect (int x, int y, int w, int h, int arc Πλάτος, int arc Ύψος void fillRoundRect (int x, int y, int w, int h, int arcWidth, int arcHeight) void draw3DRect (int x, int y, int w, int h, boolean raise) κενό fill3DRect (int x, int y, int w, int h, boolean raise)

Κάθε μία από αυτές τις μεθόδους γραφικών απαιτεί, ως παράμετροι, τις συντεταγμένες x και y για να ξεκινήσει το ορθογώνιο, και το πλάτος και το ύψος του ορθογωνίου. Τόσο το πλάτος όσο και το ύψος πρέπει να είναι θετικοί ακέραιοι. Το προκύπτον ορθογώνιο θα περικοπεί ώστε να χωράει στα όρια της τρέχουσας περιοχής αποκοπής. Το ορθογώνιο θα σχεδιαστεί με το τρέχον χρώμα προσκηνίου. Τα ορθογώνια διατίθενται σε τρία διαφορετικά στυλ: απλό, με στρογγυλεμένες γωνίες και με ένα ελαφρύ (αλλά συχνά δυσδιάκριτο) τρισδιάστατο εφέ.

Οι μέθοδοι γραφικών με στρογγυλό ορθογώνιο απαιτούν δύο επιπλέον παραμέτρους, ένα πλάτος τόξου και ένα ύψος τόξου, και οι δύο ελέγχουν τη στρογγυλοποίηση των γωνιών. Οι τρισδιάστατες ορθογώνιες μέθοδοι απαιτούν μια πρόσθετη παράμετρο που δείχνει εάν το ορθογώνιο πρέπει να βυθιστεί ή να ανυψωθεί.

Η μικροεφαρμογή στο Σχήμα 4 δείχνει αυτές τις μεθόδους σε δράση. Ο πηγαίος κώδικας είναι διαθέσιμος εδώ.

Σχήμα 4: Επίδειξη σχεδίασης ορθογωνίου

ωοειδή και τόξα

void drawOval (int x, int y, int w, int h) void fillOval (int x, int y, int w, int h) κενό drawArc (int x, int y, int w, int h, int startAngle, int arcAngle void fillArc (int x, int y, int w, int h, int startAngle, int arcAngle)

Κάθε μία από αυτές τις μεθόδους γραφικών απαιτεί, ως παραμέτρους, τις συντεταγμένες x και y του κέντρου του οβάλ ή του τόξου, και το πλάτος και το ύψος του οβάλ ή του τόξου. Τόσο το πλάτος όσο και το ύψος πρέπει να είναι θετικοί ακέραιοι. Το προκύπτον σχήμα θα περικοπεί ώστε να χωράει στα όρια της τρέχουσας περιοχής αποκοπής. Το σχήμα θα σχεδιαστεί με το τρέχον χρώμα προσκηνίου.

Οι μέθοδοι γραφικών τόξου απαιτούν δύο επιπλέον παραμέτρους, μια γωνία εκκίνησης και μια γωνία τόξου, για να καθορίσουν την αρχή του τόξου και το μέγεθος του τόξου σε μοίρες (όχι ακτίνια). Το σχήμα 5 απεικονίζει τον τρόπο καθορισμού των γωνιών.

Σχήμα 5: Προδιαγραφή γωνίας

Η μικροεφαρμογή στο Σχήμα 6 δείχνει αυτές τις μεθόδους σε δράση. Ο πηγαίος κώδικας είναι διαθέσιμος εδώ.

Σχήμα 6: Επίδειξη οβάλ και τόξου

πολύγωνα

void drawPolygon (int xPoints [], int yPoints [], int nPoints) void drawPolygon (Polygon p) void fillPolygon (int xPoints [], int yPoints [], int nPoints) κενή πλήρωση Πολύγωνο (Polygon p)

Τα πολύγωνα είναι σχήματα που σχηματίζονται από μια ακολουθία γραμμικών τμημάτων. Κάθε μία από τις μεθόδους γραφικών πολυγώνων απαιτεί, ως παραμέτρους, τις συντεταγμένες των τελικών σημείων των τμημάτων γραμμής που απαρτίζουν το πολύγωνο. Αυτά τα τελικά σημεία μπορούν να καθοριστούν με έναν από τους δύο τρόπους: ως δύο παράλληλες συστοιχίες ακέραιων, ένας που αντιπροσωπεύει τις διαδοχικές Χ συντεταγμένες και το άλλο που αντιπροσωπεύει το διαδοχικό γ συντεταγμένες; ή με μια παρουσία του Πολύγωνο τάξη. ο Πολύγωνο τάξη παρέχει τη μέθοδο προσθήκη σημείου (), που επιτρέπει τον ορισμό ενός πολυγώνου από σημείο σε σημείο. Το προκύπτον σχήμα θα περικοπεί ώστε να χωράει στα όρια της τρέχουσας περιοχής αποκοπής.

Η μικροεφαρμογή στο Σχήμα 7 δείχνει αυτές τις μεθόδους σε δράση. Ο πηγαίος κώδικας είναι διαθέσιμος εδώ.

Σχήμα 7: Επίδειξη σχεδίασης πολυγώνου

συμπέρασμα

Είτε το πιστεύετε είτε όχι, αυτά τα λίγα απλά πρωτόγονα γραφικών, σε συνδυασμό με όλα όσα έχουμε καλύψει τους τελευταίους μήνες (το AWT, ο χειρισμός συμβάντων, οι παρατηρητές κ.λπ.) είναι όλα όσα χρειάζεστε για να γράψετε έναν σωρό χρήσιμων εφαρμογών, που κυμαίνονται από παιχνίδια σε συστήματα CAD. Τον επόμενο μήνα, θα βάλω όλα αυτά τα κομμάτια μαζί και θα σας δείξω τι εννοώ.

Μείνετε συντονισμένοι.

Ο Todd Sundsted γράφει προγράμματα από τότε που οι υπολογιστές έγιναν διαθέσιμοι σε μοντέλα επιτραπέζιων υπολογιστών. Αν και αρχικά ενδιαφερόταν να δημιουργήσει κατανεμημένες εφαρμογές αντικειμένων στο C ++, ο Todd μετακόμισε στη γλώσσα προγραμματισμού Java όταν η Java έγινε η προφανής επιλογή για κάτι τέτοιο. Εκτός από τη γραφή, ο Todd παρέχει συμβουλευτικές υπηρεσίες Διαδικτύου και Ιστού σε εταιρείες στις νοτιοανατολικές Ηνωμένες Πολιτείες. : END_BIO

Μάθετε περισσότερα σχετικά με αυτό το θέμα

  • Η τάξη Java Γραφικά API

    //java.sun.com/products/JDK/CurrentRelease/api/java.awt.Graphics.html

  • Παρατηρητής και παρατηρήσιμος //www.sun.com/javaworld/jw-10-1996/jw-10-howto.html
  • Η αποτελεσματική διεπαφή χρήστη //www.sun.com/javaworld/jw-09-1996/jw-09-userint.html
  • Διαχείριση Java και συμβάντων //www.sun.com/javaworld/jw-08-1996/jw-08-event.html
  • Εισαγωγή στο AWT //www.sun.com/javaworld/jw-07-1996/jw-07-awt.html

Αυτή η ιστορία, "Χρησιμοποιώντας την κατηγορία γραφικών" δημοσιεύθηκε αρχικά από το JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found