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

Γράφετε τον δρόμο σας για προσαρμοσμένα στοιχεία γραφήματος

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

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

Δημιουργία ενός γενικού πλαισίου γραφημάτων

Το γράφημα γραμμών και το γράφημα ράβδων που πρόκειται να δημιουργήσουμε είναι αρκετά παρόμοια ώστε να μπορούμε να δημιουργήσουμε ένα γενικό

Γραφική παράσταση

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

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

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

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

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

εισαγωγή java.awt. *; εισαγωγή java.util. *; Δημόσια τάξη Graph επεκτείνει Canvas {// μεταβλητές που απαιτούνται public int top? δημόσιο int bottom? δημόσια int αριστερά? δημόσιο int δικαίωμα? int titleHeight; int labelWidth; FontMetrics fm; int padding = 4; Τίτλος συμβολοσειράς; int λεπτό; int max; Διάνυσμα είδη? 

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

 δημόσιο γράφημα (τίτλος συμβολοσειράς, int min, int max) {this.title = title; this.min = min; this.max = max; item = νέο διάνυσμα (); } // τελικός κατασκευαστής 

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

 δημόσιο κενό σχήμα (int x, int y, int πλάτος, int ύψος) {super.reshape (x, y, πλάτος, ύψος); fm = getFontMetrics (getFont ()); titleHeight = fm.getHeight (); labelWidth = Math.max (fm.stringWidth (new Integer (min) .toString ()), fm.stringWidth (new Integer (max) .toString ())) + 2; κορυφή = επένδυση + τίτλος Ύψος; κάτω = μέγεθος (). ύψος - επένδυση; αριστερά = επένδυση + ετικέταΠλάτος; δεξιά = μέγεθος (). πλάτος - επένδυση; } // τελική αναμόρφωση 

Σημείωση: Στο JDK 1.1, το αναπλάσσω η μέθοδος αντικαθίσταται με public void setBounds (ορθογώνιο r). Ανατρέξτε στην τεκμηρίωση του API για λεπτομέρειες.

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

Στη συνέχεια, θα σχεδιάσουμε το πλαίσιο για το γράφημα.

 public void paint (Graphics g) {// σχεδιάστε τον τίτλο fm = getFontMetrics (getFont ()); g.drawString (τίτλος, (μέγεθος (). πλάτος - fm.stringWidth (τίτλος)) / 2, κορυφή); // σχεδιάστε τις μέγιστες και ελάχιστες τιμές g.drawString (νέο Integer (min) .toString (), padding, bottom); g.drawString (new Integer (max) .toString (), padding, top + titleHeight); // σχεδιάστε τις κάθετες και οριζόντιες γραμμές g.drawLine (αριστερά, πάνω, αριστερά, κάτω); g.drawLine (αριστερά, κάτω, δεξιά, κάτω); } // τελική βαφή 

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

Σε αυτό το επόμενο απόσπασμα ορίζουμε το προτιμώμενο μέγεθος για το στοιχείο παρακάμπτοντας το προτιμώμενο μέγεθος μέθοδος. ο προτιμώμενο μέγεθος μέθοδος κληρονομείται επίσης από το Συστατικό τάξη. Τα στοιχεία μπορούν να καθορίσουν ένα προτιμώμενο μέγεθος και ένα ελάχιστο μέγεθος. Έχω επιλέξει ένα προτιμώμενο πλάτος 300 και ένα προτιμώμενο ύψος 200. Ο διαχειριστής διάταξης θα καλέσει αυτήν τη μέθοδο όταν εκθέτει το στοιχείο.

 public Dimension preferSize () {return (νέα διάσταση (300, 200)); }} // τελικό γράφημα 

Σημείωση: Στο JDK 1.1, το προτιμώμενο μέγεθος η μέθοδος αντικαθίσταται με δημόσια διάσταση getPreferredSize ().

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

 public void addItem (Όνομα συμβολοσειράς, τιμή int, Col Colour) {items.addElement (νέο GraphItem (όνομα, τιμή, στήλη)); } // end addItem public void addItem (Όνομα συμβολοσειράς, τιμή int) {items.addElement (νέο GraphItem (όνομα, τιμή, Color.black)); } // end addItem public void removeItem (String name) {για (int i = 0; i <items.size (); i ++) {if (((GraphItem) items.elementAt (i)). )) items.removeElementAt (i); }} // end removeItem} // τέλος γραφήματος 

Έχω διαμορφώσει το πρόσθεσε είδος και removeItem μεθόδους μετά από παρόμοιες μεθόδους στο Επιλογή τάξη, οπότε ο κώδικας θα έχει μια οικεία αίσθηση. Παρατηρήστε ότι χρησιμοποιούμε δύο πρόσθεσε είδος μέθοδοι εδώ? χρειαζόμαστε έναν τρόπο προσθήκης αντικειμένων με ή χωρίς χρώμα. Όταν προστίθεται ένα στοιχείο, ένα νέο Στοιχείο γραφήματος το αντικείμενο δημιουργείται και προστίθεται στο διάνυσμα στοιχείων. Όταν καταργηθεί ένα στοιχείο, το πρώτο στο διάνυσμα με αυτό το όνομα θα αφαιρεθεί. ο Στοιχείο γραφήματος η τάξη είναι πολύ απλή. εδώ είναι ο κωδικός:

εισαγωγή java.awt. *; τάξη GraphItem {String title; τιμή int; Χρώμα χρώματος; δημόσιο GraphItem (τίτλος συμβολοσειράς, τιμή int, χρώμα χρώματος) {this.title = title; this.value = τιμή; this.color = χρώμα; } // τελικός κατασκευαστής} // τελικό GraphItem 

ο Στοιχείο γραφήματος class ενεργεί ως κάτοχος για τις μεταβλητές που σχετίζονται με στοιχεία γραφήματος. Έχω συμπεριλάβει Χρώμα εδώ σε περίπτωση που θα χρησιμοποιηθεί σε μια υποκατηγορία του Γραφική παράσταση.

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

Δημιουργία του ραβδόγραμμα

Τώρα που έχουμε ένα πλαίσιο γραφημάτων, μπορούμε να το προσαρμόσουμε επεκτείνοντας

Γραφική παράσταση

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

χρώμα

μέθοδος για να καλέσετε το superclass

χρώμα

μέθοδος (για να σχεδιάσετε το πλαίσιο), τότε θα εκτελέσουμε το προσαρμοσμένο σχέδιο που απαιτείται για αυτόν τον τύπο γραφήματος.

εισαγωγή java.awt. *; δημόσια τάξη BarChart επεκτείνει το γράφημα {int θέση? int αύξηση? δημόσιο BarChart (τίτλος συμβολοσειράς, int min, int max) {super (title, min, max); } // τελικός κατασκευαστής 

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

Τώρα μπορούμε να καταλήξουμε σε κάποιο πραγματικό σχέδιο.

 δημόσιο κενό χρώμα (Γραφικά g) {super.paint (g); increment = (δεξιά - αριστερά) / (items.size ()); θέση = αριστερά; Temp χρώματος = g.getColor (); για (int i = 0; i <items.size (); i ++) {GraphItem item = (GraphItem) items.elementAt (i); int adjustValue = κάτω - (((item.value - min) * (κάτω - πάνω)) / (max - min)); g.drawString (item.title, position + (increment - fm.stringWidth (item.title)) / 2, adjustValue - 2); g.setColor (item.color); g.fillRect (θέση, προσαρμοσμένη τιμή, αύξηση, κάτω - προσαρμοσμένη τιμή); θέση + = αύξηση; g.setColor (θερμοκρασία); }} // end paint} // τέλος BarChart 

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

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

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

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

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

Για να διασφαλίσουμε ότι η κατακόρυφη σχεδίαση είναι πάντα σωστή, πρέπει να αντιστοιχίσουμε τις τιμές του στοιχείου γραφήματος με τις πραγματικές τοποθετήσεις pixel. Υπάρχει μια επιπλοκή: Η Μέγιστη και ελάχ Οι τιμές πρέπει να έχουν νόημα για τη θέση της τιμής του γραφήματος. Με άλλα λόγια, εάν το γράφημα ξεκινά από το 150 και φτάνει στο 200, ένα στοιχείο με τιμή 175 θα πρέπει να εμφανίζεται στα μισά του κατακόρυφου άξονα. Για να το επιτύχουμε αυτό, βρίσκουμε το ποσοστό του εύρους γραφημάτων που αντιπροσωπεύει το στοιχείο και πολλαπλασιάζουμε το με το πραγματικό εύρος εικονοστοιχείων. Επειδή το γράφημα μας είναι ανάποδα από το σύστημα συντεταγμένων του περιβάλλοντος γραφικών, αφαιρούμε αυτόν τον αριθμό από κάτω μέρος για να βρείτε το σωστό σημείο πλοκής. Θυμηθείτε, η προέλευση (0,0) βρίσκεται στην επάνω αριστερή γωνία για τον κώδικα, αλλά στην κάτω αριστερή γωνία για το στυλ του γραφήματος που δημιουργούμε.

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