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

Εισαγωγή στο AWT

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

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

Τι είναι το περιβάλλον εργασίας χρήστη

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

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

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

Εξαρτήματα και δοχεία

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

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

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

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

Τύποι συστατικών

Το Σχήμα 3 δείχνει τη σχέση μεταβίβασης μεταξύ των κατηγοριών στοιχείων διεπαφής χρήστη που παρέχονται από το AWT. Το Class Component καθορίζει τη διεπαφή στην οποία πρέπει να τηρούν όλα τα στοιχεία.

Το AWT παρέχει εννέα βασικές κατηγορίες συστατικών εκτός κοντέινερ από τις οποίες μπορεί να κατασκευαστεί μια διεπαφή χρήστη. (Φυσικά, οι νέες κλάσεις συστατικών ενδέχεται να προέρχονται από οποιοδήποτε από αυτά ή από το ίδιο το Class Component.) Αυτές οι εννέα τάξεις είναι Κουμπιά κλάσης, Καμβάς, Πλαίσιο ελέγχου, Επιλογή, Ετικέτα, Λίστα, Γραμμή κύλισης, TextArea και TextField. Το σχήμα 4 απεικονίζει μια παρουσία κάθε τάξης.

Χρειάζεστε ένα πρόγραμμα περιήγησης με δυνατότητα Java για να δείτε αυτό το applet.

Σχήμα 4.

Εννέα στοιχεία διεπαφής χρήστη

Η πηγή για αυτήν την οθόνη βρίσκεται εδώ.

Τύποι εμπορευματοκιβωτίων

Το AWT παρέχει τέσσερις κατηγορίες κοντέινερ. Πρόκειται για το παράθυρο Window και τους δύο υποτύπους του - Class Frame και class Dialog - καθώς και την κατηγορία Panel. Εκτός από τα κοντέινερ που παρέχονται από το AWT, η κλάση Applet είναι ένα κοντέινερ - είναι ένας υποτύπος της κλάσης του Πίνακα και επομένως μπορεί να κρατήσει στοιχεία. Σύντομες περιγραφές για κάθε κατηγορία κοντέινερ που παρέχονται από το AWT παρέχονται παρακάτω.

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

Ένα γενικό δοχείο για συγκράτηση εξαρτημάτων. Μια παρουσία της κλάσης Panel παρέχει ένα κοντέινερ στο οποίο μπορείτε να προσθέσετε στοιχεία.

Δημιουργία κοντέινερ

Πριν από την προσθήκη των στοιχείων που αποτελούν μια διεπαφή χρήστη, ο προγραμματιστής πρέπει να δημιουργήσει ένα κοντέινερ. Κατά τη δημιουργία μιας εφαρμογής, ο προγραμματιστής πρέπει πρώτα να δημιουργήσει μια παρουσία παραθύρου κλάσης ή πλαισίου κλάσης. Κατά τη δημιουργία μιας μικροεφαρμογής, υπάρχει ήδη ένα πλαίσιο (το παράθυρο του προγράμματος περιήγησης). Δεδομένου ότι η κλάση Applet είναι ένας δευτερεύων τύπος της κλάσης Panel, ο προγραμματιστής μπορεί να προσθέσει τα στοιχεία στην παρουσία της ίδιας της κλάσης Applet.

Ο κωδικός στην καταχώριση 1 δημιουργεί ένα κενό πλαίσιο. Ο τίτλος του καρέ ("Παράδειγμα 1") ορίζεται στην κλήση προς τον κατασκευαστή. Ένα πλαίσιο είναι αρχικά αόρατο και πρέπει να γίνει ορατό με την επίκλησή του προβολή() μέθοδος.

εισαγωγή java.awt. *;

δημόσια τάξη Παράδειγμα1 {δημόσια στατική κενή κύρια (String [] args) {Frame f = new Frame ("Παράδειγμα 1");

στ. εμφάνιση (); }}

Λίστα 1.

Ένα άδειο πλαίσιο

Ο κωδικός στην Λίστα 2 επεκτείνει τον κώδικα από την Καταχώριση 1 έτσι ώστε η νέα κλάση να κληρονομείται από τον Πίνακα κλάσης. Στο κύριος() μέθοδος, μια παρουσία αυτής της νέας κλάσης δημιουργείται και προστίθεται στο αντικείμενο Frame μέσω μιας κλήσης στο Προσθήκη() μέθοδος. Στη συνέχεια εμφανίζεται το αποτέλεσμα. Τα αποτελέσματα και των δύο παραδειγμάτων θα πρέπει να φαίνονται πανομοιότυπα (δηλαδή, θα πρέπει να φαίνονται αρκετά μη ενδιαφέροντα).

εισαγωγή java.awt. *;

δημόσια κλάση Το Παράδειγμα1a επεκτείνει τον Πίνακα {public static void main (String [] args) {Frame f = new Frame ("Παράδειγμα 1α");

Παράδειγμα1α ex = νέο Παράδειγμα1α ();

f.add ("Κέντρο", πρώην);

στ. συσκευασία (); στ. εμφάνιση (); }}

Λίστα 2.

Ένα πλαίσιο με ένα κενό πλαίσιο

Με την εξαγωγή της νέας κλάσης από το Class Applet αντί για το Class Panel, αυτό το παράδειγμα μπορεί τώρα να εκτελεστεί είτε ως αυτόνομη εφαρμογή είτε ως applet ενσωματωμένη σε μια ιστοσελίδα. Ο κώδικας για αυτό το παράδειγμα παρέχεται στην Λίστα 3. Η μικροεφαρμογή που προκύπτει εμφανίζεται στο Σχήμα 5 (και εξακολουθεί να είναι αρκετά μη ενδιαφέρουσα).

εισαγωγή java.awt. *;

δημόσια κλάση Το παράδειγμα1b επεκτείνει το java.applet.Applet {public static void main (String [] args) {Frame f = new Frame ("Παράδειγμα 1b");

Παράδειγμα1β ex = νέο Παράδειγμα1β ();

f.add ("Κέντρο", πρώην);

στ. συσκευασία (); στ. εμφάνιση (); }}

Λίστα 3.

Ένα πλαίσιο με ένα κενό applet

Χρειάζεστε ένα πρόγραμμα περιήγησης με δυνατότητα Java για να δείτε αυτό το applet.

Σχήμα 5.

Ένα άδειο πλαίσιο

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

Προσθήκη στοιχείων σε κοντέινερ

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

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

εισαγωγή java.awt. *;

δημόσια τάξη Το παράδειγμα3 επεκτείνει το java.applet.Applet {public void init () {add (new Button ("One")); προσθήκη (νέο κουμπί ("Δύο")); }

public Dimension preferSize () {return new Dimension (200, 100); }

Δημόσιο στατικό κενό (String [] args) {Frame f = new Frame ("Παράδειγμα 3");

Παράδειγμα3 ex = νέο Παράδειγμα3 ();

ex.init ();

f.add ("Κέντρο", πρώην);

στ. συσκευασία (); στ. εμφάνιση (); }}

Λίστα 4.

Μια μικροεφαρμογή με δύο κουμπιά

Χρειάζεστε ένα πρόγραμμα περιήγησης με δυνατότητα Java για να δείτε αυτό το applet.

Σχήμα 6.

Μια μικροεφαρμογή με δύο κουμπιά

Διάταξη στοιχείου

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

Το AWT παρέχει πέντε διαχειριστές διάταξης. Οι τιμές κυμαίνονται από πολύ απλές έως πολύπλοκες. Αυτό το άρθρο καλύπτει μόνο τις δύο κλάσεις διαχείρισης διάταξης που χρησιμοποιούνται από τα παραδείγματα του παρόντος: την κλάση FlowLayout και την κλάση BorderLayout.

Η τάξη FlowLayout τοποθετεί στοιχεία σε ένα κοντέινερ από αριστερά προς τα δεξιά. Όταν εξαντληθεί ο χώρος σε μία σειρά, ξεκινά μια άλλη σειρά. Η έκδοση ενός ορισμού ενός κοντέινερ Προσθήκη() χρησιμοποιείται μέθοδος για την προσθήκη στοιχείων.

Η κλάση BorderLayout έχει πέντε ζώνες όπως απεικονίζεται στο Σχήμα 7. Οι ζώνες ονομάζονται "Βόρεια", "Νότια", "Ανατολή", "Δύση" και "Κέντρο". Ένα μόνο συστατικό μπορεί να τοποθετηθεί σε καθεμία από αυτές τις πέντε ζώνες. Όταν το μέγεθος του περιέκτη περικλείει το μέγεθος, κάθε ζώνη περιγράμματος αλλάζει το μέγεθος αρκετά ώστε να συγκρατεί το στοιχείο τοποθετημένο μέσα. Οποιοσδήποτε επιπλέον χώρος δίνεται στην κεντρική ζώνη. Η έκδοση δύο ορισμάτων ενός κοντέινερ Προσθήκη() χρησιμοποιείται μέθοδος για την προσθήκη στοιχείων. Το πρώτο όρισμα είναι ένα αντικείμενο συμβολοσειράς που ονομάζει τη ζώνη στην οποία θα τοποθετηθεί το στοιχείο.

Κάθε κλάση κοντέινερ έχει έναν προεπιλεγμένο διαχειριστή διάταξης. Ο προεπιλεγμένος διαχειριστής διάταξης για την κλάση πλαισίου και την κατηγορία διαλόγου είναι ο διαχειριστής BorderLayout. Η προεπιλεγμένη διαχείριση διάταξης για την κλάση Panel (και την κλάση Applet) είναι η διαχείριση FlowLayout.

Ο κώδικας στην καταχώριση 5 χρησιμοποιεί και τους δύο διαχειριστές διάταξης και περιλαμβάνει μερικά ακόμη στοιχεία διεπαφής χρήστη. Το αποτέλεσμα εμφανίζεται στο σχήμα 8.

εισαγωγή java.awt. *;

δημόσια τάξη Το παράδειγμα4 επεκτείνει το java.applet.Applet {public void init () {Panel p;

setLayout (νέο BorderLayout ());

p = νέο πάνελ ();

p.add (νέο TextArea ());

προσθήκη ("Κέντρο", σελ);

p = νέο πάνελ ();

p.add (νέο κουμπί ("Ένα")); p.add (νέο κουμπί ("Δύο"));

Επιλογή γ = νέα επιλογή ();

c.addItem ("ένα"); c.addItem ("δύο"); c.addItem ("τρία");

p.add (c);

προσθήκη ("Νότια", σελ); }

Δημόσιο στατικό κενό (String [] args) {Frame f = new Frame ("Παράδειγμα 4");

Παράδειγμα4 ex = νέο Παράδειγμα4 ();

ex.init ();

f.add ("Κέντρο", πρώην);

στ. συσκευασία (); στ. εμφάνιση (); }}

Λίστα 5.

Ένα πιο περίπλοκο παράδειγμα

Χρειάζεστε ένα πρόγραμμα περιήγησης με δυνατότητα Java για να δείτε αυτό το applet.

Σχήμα 8.

Ένα πιο περίπλοκο παράδειγμα

Χειρισμός εκδηλώσεων

Τα παραπάνω παραδείγματα δεν κάνουν τίποτα περισσότερο από την εμφάνιση αδρανούς περιβάλλοντος χρήστη. Φυσικά, είναι πολύ σημαντικό η διεπαφή χρήστη να αναλάβει δράση ως αποτέλεσμα της εισόδου του χρήστη. Ωστόσο, είναι πέρα ​​από το πεδίο εφαρμογής αυτού του άρθρου να ερευνήσουμε βαθιά τα μυστήρια του χειρισμού συμβάντων. Αυτό πρέπει να περιμένει μέχρι ένα μελλοντικό άρθρο. Ωστόσο, προς όφελος της πληρότητας, ο κωδικός παραδείγματος στην Λίστα 6 δείχνει πώς να χειριστείτε έναν τύπο συμβάντος που μπορεί να λάβει ένα πρόγραμμα. Η νέα τάξη παρακάμπτει το δράση() μέθοδος που παρέχεται από την κλάση Component. ο δράση() Η μέθοδος ανταποκρίνεται στα συμβάντα δράσης που δημιουργούνται, για παράδειγμα, με την επιλογή ενός αντικειμένου από μια αναδυόμενη λίστα. ο δράση() Η μέθοδος απαιτεί να παρέχονται δύο παράμετροι, μια παρουσία συμβάντος και μια παρουσία αντικειμένου. Η παρουσία συμβάντος περιέχει πληροφορίες σχετικά με το συμβάν, συμπεριλαμβανομένου του στόχου του συμβάντος (του στοιχείου που έλαβε το συμβάν για πρώτη φορά), των συντεταγμένων x και y του συμβάντος και του χρόνου που συνέβη το συμβάν. Η παρουσία αντικειμένου κρατά ένα κομμάτι δεδομένων για συγκεκριμένο συμβάν. Για αντικείμενα κουμπιών περιέχει το κείμενο στην ετικέτα κουμπιού.

εισαγωγή java.awt. *;

δημόσια τάξη Το Παράδειγμα5 επεκτείνει το java.applet.Applet {TextArea ta = null;

public vit init () {Πίνακας p;

setLayout (νέο BorderLayout ());

p = νέο πάνελ ();

ta = νέο TextArea ();

p.add (ta);

προσθήκη ("Κέντρο", σελ);

p = νέο πάνελ ();

p.add (νέο κουμπί ("Ένα")); p.add (νέο κουμπί ("Δύο"));

Επιλογή γ = νέα επιλογή ();

c.addItem ("ένα"); c.addItem ("δύο"); c.addItem ("τρία");

p.add (c);

προσθήκη ("Νότος", σελ); }

δημόσια boolean δράση (Event e, Object o) {String str = (String) o;

ta.appendText (str + "\ n");

επιστροφή ψευδής? }

δημόσιο στατικό κενό (String [] args) {Frame f = new Frame ("Παράδειγμα 5");

Παράδειγμα5 ex = νέο Παράδειγμα5 ();

ex.init ();

f.add ("Κέντρο", πρώην);

στ. συσκευασία (); στ. εμφάνιση (); }}

Λίστα 6.

Ένα παράδειγμα με το χειρισμό συμβάντων