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

Java Tip 61: Αποκοπή, αντιγραφή και επικόλληση σε Java

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

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

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

Προτού προχωρήσουμε περισσότερο, ας ρίξουμε μια ματιά σε όλες τις τάξεις που εμπλέκονται στη διαχείριση του πρόχειρου. Αυτές οι τάξεις, που αναφέρονται στον παρακάτω πίνακα, είναι όλα μέρος του java.awt.datatransfer πακέτο.

Λίστα όλων των τάξεων στο πακέτο java.awt.datatransfer
ΟνομαΤύποςΠεριγραφή
ΠρόχειροΤάξηΑσχολείται με όλα τα μεταβιβάσιμα
ΠρόχειροΔιεπαφήΚάθε τάξη που ασχολείται με το πρόχειρο πρέπει να εφαρμόσει αυτήν τη διεπαφή. Αυτή η διεπαφή χρησιμοποιείται για την ειδοποίηση όταν τα δεδομένα που είχαν αρχικά τοποθετηθεί στο πρόχειρο έχουν αντικατασταθεί
DataflavorΤάξηΑντιπροσωπεύει όλους τους τύπους δεδομένων που υποστηρίζονται με δυνατότητα μεταφοράς
Επιλογή StringΤάξηΈνας τύπος μεταβιβάσιμου που παρέχεται με Java
ΜεταβιβάσιμοςΔιεπαφήΠεριτύλιγμα σε αντικείμενα που περνούν στο πρόχειρο
Μη υποστηριζόμενη γεύση ΕξαίρεσηΤάξηΕξαίρεση που μεταφέρεται με δυνατότητα μεταφοράς για μη υποστηριζόμενη γεύση δεδομένων

Περισσότερα για τις τάξεις του πρόχειρου

Ας πάμε βαθύτερα στην εξερεύνηση του java.awt.datatransfer πακέτο κοιτάζοντας λεπτομερώς σε κάθε τάξη.

Η κατηγορία Πρόχειρο

ο Πρόχειρο class είναι ο σύνδεσμός σας για πρόσβαση στο πρόχειρο. Περιλαμβάνει τρεις μεθόδους, οι οποίες ορίζονται στον ακόλουθο πίνακα:

Κατηγορία πρόχειρου
ΜέθοδοςΠεριγραφή
Συμβολοσειρά getName ()Λάβετε το όνομα του πρόχειρου
void setContents (Μεταβιβάσιμο, Πρόχειρο)Ορίστε το περιεχόμενο του πρόχειρου μαζί με το αντικείμενο κατόχου
Μεταβιβάσιμο getContent (Αντικείμενο)Αποκτήστε το περιεχόμενο του πρόχειρου με τη μορφή ενός Μεταφερόμενου αντικειμένου. Το αντικείμενο που πέρασε ως παράμετρος είναι ο κάτοχος

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

Πρόχειρο πρόχειρο = getToolkit () .getSystemClipboard ();

Από την άλλη πλευρά, για να δημιουργήσετε ένα τοπικό πρόχειρο πρέπει να δημιουργήσετε μόνο ένα Πρόχειρο αντικείμενο με το όνομα που θέλετε να αντιστοιχίσετε σε αυτό, για παράδειγμα:

Πρόχειρο πρόχειρο = νέο Πρόχειρο ("Το πρώτο μου πρόχειρο");

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

Η διεπαφή ClipboardOwner

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

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

Εφαρμογή του Πρόχειρο η διεπαφή είναι σχετικά απλή, επειδή υπάρχει μόνο μία μέθοδος για εφαρμογή. Αυτή η μέθοδος θα κάνει το πρόγραμμά σας να παραιτηθεί από την ιδιοκτησία του πρόχειρου.

Η κλάση DataFlavour

ο DataFlavour η τάξη χρησιμοποιείται για την αναπαράσταση του τύπος ενός αντικειμένου. Δεν περιορίζεστε σε μία γεύση δεδομένων (ή τύπο) ανά αντικείμενο. Και, όπως εμείς, τα αντικείμενά σας μπορούν να έχουν πολλές προσωπικότητες! Για παράδειγμα, μια κλάση εικόνας μπορεί να αναπαρασταθεί ως κλάση Java ή ως πίνακας δυαδικών ψηφίων (GIF, JPEG και ούτω καθεξής). Στην πραγματικότητα, α DataFlavour class είναι ένα περιτύλιγμα τύπου MIME. Το πρότυπο MIME είναι εκτεταμένο, επομένως ουσιαστικά δεν υπάρχουν όρια στα δεδομένα που μπορούν να μεταφερθούν στο πρόχειρο. (Μια συζήτηση για το πρότυπο MIME δεν εμπίπτει στο πεδίο εφαρμογής αυτού του άρθρου, αλλά μπορείτε να βρείτε πρόσθετες πληροφορίες στην ενότητα Πόροι.)

Ως παράδειγμα μιας γεύσης δεδομένων, θα διαπιστώσετε ότι το Επιλογή String Η τάξη έχει δύο γεύσεις με βάση τους τύπους MIME. Κατά την εφαρμογή είναι το "application / x-java-serialized-object" και το δεύτερο είναι "text / plain; charset = unicode". Στην πραγματικότητα, αυτή η εφαρμογή μας λέει ότι μπορούμε να ανακτήσουμε κείμενο από το πρόχειρο ως Σειρά τάξη (application / x-java-serialized-αντικείμενοή ως απλό κείμενο (κείμενο / απλό; charset = unicode).

Υπάρχουν δύο τρόποι για να δημιουργήσετε ένα DataFlavour. Μπορείς να γράψεις:

δημόσιο DataFlavour (representationClass, String humanRepresentationName)

Αυτός ο κατασκευαστής θα δημιουργήσει μια νέα γεύση δεδομένων που αντιπροσωπεύει μια κλάση Java. Οι επιστρεφόμενοι DataFlavour θα έχω representationClass = representationClass και ένα mimeType = εφαρμογή / x-java-serialized-αντικείμενο. Για παράδειγμα, τα ακόλουθα θα δημιουργούσαν ένα DataFlavour για το java.awt. Κουμπί:

DataFlavour (Class.forName ("java.awt.Button"), "Κουμπί AWT");

Τώρα, αυτός ο δεύτερος κατασκευαστής

δημόσιο DataFlavour (String mimeType, String humanRepresentationName)

θα κατασκευάσει ένα DataFlavour χρησιμοποιώντας ένα Τύπος Mime. Οι επιστρεφόμενοι DataFlavour θα βασίζεται στο Τύπος Mime. Εάν το Τύπος Mime είναι application / x-java-serialized-αντικείμενο, τότε το αποτέλεσμα θα είναι το ίδιο σαν να καλέσατε τον προηγούμενο κατασκευαστή. Ωστόσο, οι επιστρεφόμενοι DataFlavour θα είναι representationClass = InputStream και mimeType = mimeType. Για παράδειγμα, η ακόλουθη κλήση θα δημιουργούσε μια γεύση απλού κειμένου:

δημόσιο DataFlavour ("text / plain; charset = unicode", "Unicode");

Ο παρακάτω πίνακας δείχνει τις μεθόδους του DataFlavour τάξη.

Κατηγορία DataFlavour
ΜέθοδοιΠεριγραφή
boolean ισούται με (DataFlavor)Ελέγξτε εάν το παρεχόμενο DataFlavor είναι ίσο με το DataFlavor που αντιπροσωπεύεται από αυτήν την κλάση
String getHumanPresentableName ()Επιστρέψτε το ανθρώπινο όνομα που αντιπροσωπεύεται για τη μορφή που αντιπροσωπεύει αυτό το DataFlavour
void setHumanPresentableName (συμβολοσειρά)Ορίστε το όνομα ανθρώπινης αναπαράστασης για αυτό το DataFlavour
String getMimeType ()Αποκτήστε τη συμβολοσειρά τύπου MIME που αντιπροσωπεύεται από αυτό το DataFlavour
Κλάση getRepresentationClass ()Επιστρέψτε την κλάση που αντιπροσωπεύει αυτήν την τάξη

Η μεταβιβάσιμη διεπαφή

ο Μεταβιβάσιμος διεπαφή πρέπει να εφαρμοστεί από όλες τις τάξεις που θέλετε να στείλετε στο πρόχειρο, εξ ου και το Πρόχειρο Η τάξη θα καταλάβει μόνο τις τάξεις που έχουν τυλιχθεί από το Μεταβιβάσιμος διεπαφή. ο Μεταβιβάσιμος διεπαφή αποτελείται από τρεις μεθόδους:

Μεταβιβάσιμη διεπαφή
ΜέθοδοιΠεριγραφή
DataFlavour getTransferDataFlavor ()Επιστρέψτε έναν πίνακα DataFlavour που αντιπροσωπεύει το αντικείμενο
boolean isDataFlavorSupported (DataFlavour)Ελέγξτε εάν υποστηρίζεται το παρεχόμενο DataFlavor
Αντικείμενο getTransferData (DataFlavor)Επιστρέψτε το αντικείμενο που αντιπροσωπεύεται από το παρεχόμενο DataFlavour

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

Στις επόμενες ενότητες, θα εφαρμόσουμε στην πράξη όσα έχουμε μάθει.

Η συνταγή για τη χρήση του πρόχειρου

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

Βήμα 1. Δημιουργήστε μια τάξη που ονομάζεται xxxxSelection. Εδώ, το xxx πρέπει να ονομάσει τον τύπο που αντιπροσωπεύει αυτή η γεύση. Για παράδειγμα, Επιλογή εικόνας θα ήταν καλό όνομα για μια γεύση εικόνας. Αυτή η σύμβαση ονομασίας είναι απλώς μια πρόταση, φυσικά. Ακολουθώ την καθιερωμένη σύμβαση χρήσης με το Επιλογή String παρέχονται στο JDK, αλλά μπορείτε να ονομάσετε αυτήν την τάξη οτιδήποτε θέλετε. Είναι σημαντικό να θυμάστε ότι αυτό το αντικείμενο πρέπει να εφαρμόσει το Μεταβιβάσιμος και Πρόχειρο διεπαφές. Εάν σκοπεύετε να μεταφέρετε κείμενο, το Επιλογή String αντ 'αυτού πρέπει να χρησιμοποιηθεί.

Βήμα 2. Ορίστε μια τάξη για πρόσβαση στο πρόχειρο. Για να αποκτήσετε πρόσβαση σε ένα τοπικό πρόχειρο, χρησιμοποιήστε την ακόλουθη κλήση: Πρόχειρο πρόχειρο = νέο Πρόχειρο ("όνομα"). Για να αποκτήσετε πρόσβαση στο πρόχειρο του ομότιμου λειτουργικού συστήματος, χρησιμοποιήστε αυτήν την κλήση αντ 'αυτού: Πρόχειρο πρόχειρο = getToolkit () .getSystemClipboard ().

Βήμα 3. Ορίστε το περιεχόμενο του πρόχειρου. Για να το κάνετε αυτό, χρησιμοποιήστε το σύνολο περιεχομένου μέθοδος στο Πρόχειρο κλάση, όπου η πρώτη παράμετρος είναι ένα αντικείμενο που εφαρμόζει a Μεταβιβάσιμος (xxxxΕπιλογή κλάση που δημιουργήθηκε στο Βήμα 1) και η δεύτερη παράμετρος είναι μια αναφορά στην κλάση που καλεί αυτήν τη μέθοδο.

Βήμα 4. Αποκτήστε το περιεχόμενο του πρόχειρου. Χρησιμοποιήστε το getContent μέθοδος στο Πρόχειρο τάξη. Αυτή η μέθοδος θα επιστρέψει μια κατηγορία τύπου Μεταβιβάσιμος.

Βήμα 5. Εφαρμογή μιας «λειτουργίας διακοπής». Για να το κάνετε αυτό, πρέπει να διαγράψετε με μη αυτόματο τρόπο τα δεδομένα αφού αντιγραφούν στο πρόχειρο. Η Java δεν παρέχει καμία εφαρμογή διακοπής.

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

Λίστα 1

Ας εξετάσουμε αυτό το applet:

Λίστα 1

Το παρακάτω είναι μια εξήγηση συγκεκριμένων γραμμών κώδικα στην Λίστα 1.

Γραμμή 9: Ορίστε την τάξη applet1 να επεκτείνει το Applet τάξη και εφαρμόστε το Πρόχειρο διεπαφή.

Γραμμή 17: Ορίστε ένα αντικείμενο πρόχειρου.

Γραμμή 26: Ορίστε το αντικείμενο του πρόχειρου στο πρόχειρο του λειτουργικού συστήματος peer.

Γραμμές 45 έως 47: Εφαρμόστε τη μόνη μέθοδο σε αυτήν τη διεπαφή. Σε αυτό το άρθρο δεν χρησιμοποιούμε το χαμένη ιδιοκτησία μέθοδος, αλλά απλώς εκτυπώστε ένα μήνυμα στην κονσόλα. Θα μπορούσατε να πειραματιστείτε με αυτήν τη μέθοδο αντιγράφοντας κάποιο κείμενο στο πρόχειρο χρησιμοποιώντας αυτήν τη μικροεφαρμογή και, στη συνέχεια, αντιγράψτε κάτι άλλο από άλλη εφαρμογή. Θα πρέπει να δείτε το μήνυμα χαμένης ιδιοκτησίας να εμφανίζεται στην κονσόλα Java, επειδή τα δεδομένα που τοποθετήθηκαν στο πρόχειρο (χρησιμοποιώντας το Java applet) αντικαταστάθηκαν από την άλλη εφαρμογή.

Γραμμή 52: Ορίστε μια κλάση του τύπου Επιλογή String που εφαρμόζουν μια γεύση δεδομένων κειμένου. Στη συνέχεια λαμβάνουμε το περιεχόμενο του πεδίου κειμένου πηγής.

Γραμμή 53: Ορίστε το περιεχόμενο του πρόχειρου στο πεδίο περιεχομένου τάξη που ορίσαμε στην προηγούμενη γραμμή. Σημειώστε ότι πρέπει να παρέχουμε στον κάτοχο αυτής της κλάσης, σε αυτήν την περίπτωση, αυτό το applet.

Γραμμή 61: Ορίστε ένα αντικείμενο τύπου Μεταβιβάσιμος για να λάβετε το περιεχόμενο του πρόχειρου.

Γραμμή 63: Επικυρώστε δύο πράγματα. Πρώτον, είναι άδειο το πρόχειρο; Δεύτερον, είναι το περιεχόμενο του πρόχειρου η σωστή γεύση; Σε αυτήν την περίπτωση ψάχνουμε για stringFlavor.

Γραμμή 67: Αποκτήστε το περιεχόμενο του πρόχειρου σε μια μεταβλητή συμβολοσειράς. Για να το κάνουμε αυτό, καλούμε το getTransferData μέθοδο με την απαιτούμενη γεύση. Σε αυτήν την περίπτωση, χρειαζόμαστε ένα DataFlavor.stringFlavor τύπος.

Γραμμή 69: Ορίστε το περιεχόμενο του πεδίου κειμένου προορισμού στο περιεχόμενο του πρόχειρου.

Μπορείτε να πειραματιστείτε με αυτήν τη μικροεφαρμογή μεταφέροντας κείμενο μεταξύ αυτής της μικροεφαρμογής και μιας άλλης μικροεφαρμογής Java ή μεταξύ μιας εφαρμογής Java και ενός εγγενούς προγράμματος, όπως το Σημειωματάριο (Notepad), για όσους χρησιμοποιούν Microsoft Windows.

Λίστα 2

Στο δεύτερο παράδειγμα, θα γράψουμε μια μικροεφαρμογή που αντιγράφει μια εικόνα στο πρόχειρο. Η εικόνα θα εφαρμόσει τη δική της γεύση.

Λίστα 2

Το παρακάτω είναι μια εξήγηση συγκεκριμένων γραμμών κώδικα στην Λίστα 2.

Γραμμή 27: Δημιουργήστε ένα αντικείμενο πρόχειρου που αναφέρεται σε ένα τοπικό πρόχειρο.

Γραμμή 41: Ορίστε το ξινή εικόνα έλεγχος προς Image.gif.

Γραμμές 44 έως 50: Εφαρμόστε το χαμένη ιδιοκτησία μέθοδος. Εκτυπώνουμε απλά ένα μήνυμα στην κονσόλα Java.

Γραμμή 6: Δημιουργήστε ένα Επιλογή εικόνας αντικείμενο με βάση την εικόνα στο πηγή εικόνας έλεγχος.

Γραμμή 57: Ορίστε το περιεχόμενο του πρόχειρου με το Επιλογή εικόνας αντικείμενο.

Γραμμή 66: Αποκτήστε το περιεχόμενο του πρόχειρου.

Γραμμή 68: Βεβαιωθείτε ότι το περιεχόμενο δεν είναι μηδενικό και ότι υποστηρίζεται η γεύση που αναζητούμε.

Γραμμή 71: Λάβετε τα δεδομένα με την κατάλληλη γεύση.

Γραμμή 72: Ορίστε το destinationImage έλεγχος στο περιεχόμενο που μόλις αποκτήθηκε.

Γραμμή 90: Ορίστε το Επιλογή εικόνας τάξη.

Γραμμή 93: Ορίστε έναν πίνακα DataFlavour που ονομάζεται υποστηριζόμενες γεύσεις με ένα στοιχείο (imageFlavour).

Γραμμή 102: Δημιουργήστε τη γεύση της εικόνας. Η γεύση που δημιουργείται βασίζεται στο java.awt. Εικόνα με το όνομα αναπαράστασης "Εικόνα".

Γραμμές 111 έως 130: Εφαρμόστε το Μεταβιβάσιμος μεθόδους.

Γραμμή 123: Επιστρέψτε το περιεχόμενο του πρόχειρου με αυτήν τη μέθοδο.

Γραμμή 125: Επικυρώστε τη γεύση. Εάν υποστηρίζεται η ζητούμενη γεύση, τότε επιστρέφεται το αντικείμενο της εικόνας. Διαφορετικά, απορρίπτεται μια εξαίρεση.

Στην καταχώριση 1, χρησιμοποιήσαμε την προεπιλεγμένη γεύση δεδομένων (Επιλογή String) για να στείλετε κείμενο στο πρόχειρο του συστήματος. Στην Λίστα 2, προχωρήσαμε περαιτέρω εφαρμόζοντας τη δική μας γεύση δεδομένων java.awt. Εικόνα.

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