Java savjet 61: Izrežite, kopirajte i zalijepite u Javi

Ovaj će vam članak pružiti dobro razumijevanje kako poslati i dobiti informacije iz međuspremnika na Javi. Također ćete naučiti kako se nositi s različitim dostupnim okusima podataka. Na kraju ćemo pokriti više osobnosti međuspremnika i kako pružaju podršku za više od jednog okusa podataka.

Java nudi dvije vrste međuspremnika: lokalni i sistemski. Lokalni međuspremnici dostupni su samo u virtualnom stroju na kojem je pokrenut vaš aplet ili aplikacija. Međutim, za razliku od nekih operativnih sustava koji vas ograničavaju na samo jedan međuspremnik, Java vam omogućuje da imate onoliko lokalnih međuspremnika koliko želite. Pristup određenom lokalnom međuspremniku jednostavan je kao i pozivanje po imenu.

Međuspremnici sustava izravno su povezani s ravnopravnim operativnim sustavom, što omogućava vašoj aplikaciji da prenosi podatke između bilo koje aplikacije koja se izvodi pod tim operativnim sustavom. Nedostatak korištenja međuspremnika sustava je taj što možete prenositi samo tekstualne podatke. Međuspremnik sustava ne podržava druge vrste objekata. Uz malo sreće, ovaj će se problem riješiti u sljedećem izdanju JDK.

Prije nego što nastavimo dalje, pogledajmo sve razrede koji su uključeni u manipulaciju međuspremnikom. Sve su ove klase, navedene u donjoj tablici, dio paketa java.awt.datatransfer .

Popis svih klasa u paketu java.awt.datatransfer
Ime Tip Opis
Clipboard Razred Bavi se svime što je prenosivo
ClipboardOwner Sučelje Svaka klasa koja se bavi međuspremnikom mora implementirati ovo sučelje. Ovo sučelje služi za obavještavanje kada su podaci prvobitno smješteni u međuspremnik prepisani
Dataflavor Razred Predstavlja sve vrste podataka koje prenosive podrške
StringSelection Razred Jedna vrsta prenosivih datoteka koja se isporučuje s Javom
Transferable Sučelje Omotač objekata prosljeđenih u međuspremnik
UnsupportedFlavor Exception Razred Iznimka koju prenosi prijenos zbog nepodržane arome podataka

Više o tečajevima međuspremnika

Krenimo dublje u istraživanje java.awt.datatransferpaketa detaljno promatrajući svaki razred.

Razred međuspremnika

ClipboardKlasa vaš link za pristupanje međuspremnik. Uključuje tri metode koje su definirane u sljedećoj tablici:

Predavanje u međuspremnik
Metoda Opis
String getName () Dohvatite naziv međuspremnika
void setContents (Transferable, ClipboardOwner) Postavite sadržaj međuspremnika zajedno s vlasničkim objektom
Transferable getContent (Object) Dohvatite sadržaj međuspremnika u obliku prijenosnog objekta. Objekt koji se prosljeđuje kao parametar je vlasnik

Gore navedene tri Clipboardmetode klase omogućuju imenovanje međuspremnika, slanje podataka ili dobivanje podataka iz njega. Pristup međuspremniku sustava ili stvaranje lokalnog međuspremnika različit je i zahtijeva malo više rasprave. Da biste pristupili međuspremniku sustava, Clipboardklasi dodijelite referencu iz međuspremnika sustava , kao što je:

Clipboard clipboard = getToolkit ().getSystemClipboard ();

S druge strane, za stvaranje lokalnog međuspremnika trebate stvoriti samo Clipboardobjekt s imenom koje mu želite dodijeliti, na primjer:

Clipboard clipboard = new Clipboard ("My first clipboard");

Pristup međuspremniku sustava ili stvaranje lokalnog međuspremnika različit je, ali jednostavan.

Sučelje ClipboardOwner

Budući da je Java jezik s više platformi i jer se operativni sustavi različito ponašaju prema međuspremnicima, autori jezika Java morali su smisliti mehanizam za rješavanje suptilnih razlika. To je razlog prisutnosti ClipboardOwnersučelja. Njegova je jedina funkcija informirati vlasnika međuspremnika kada netko drugi prepisuje njegove podatke. Također može signalizirati aplikaciji kada treba objaviti resurs povezan s podacima.

U stvarnoj aplikaciji lostOwnershipmetoda bi se mogla koristiti za postavljanje zastavice koja informira vašu aplikaciju o dostupnosti podataka u međuspremniku. Microsoft Word, iako nije napisan na Javi, dobar je primjer ovog mehanizma koji djeluje u aplikaciji. Kad god stavite nešto u međuspremnik unutar programa Word, a zatim zatvorite, pojavit će se dijaloški okvir koji vas obavještava da se podaci nalaze u međuspremniku. Tada ćete biti upitani želite li podatke ostaviti u međuspremniku.

Implementacija ClipboardOwnersučelja relativno je jednostavna jer postoji samo jedna metoda za implementaciju. Ova metoda će uzrokovati da se vaš program odrekne vlasništva nad međuspremnikom.

Klasa DataFlavor

DataFlavorKlasa se koristi da predstavlja vrstu objekta. Niste ograničeni na jedan okus (ili vrstu) podataka po objektu. I poput nas, vaši predmeti mogu imati više osobnosti! Na primjer, klasa slike može se predstaviti kao Java klasa ili kao niz bitova (GIF, JPEG i tako dalje). U stvarnosti je DataFlavorklasa omot MIME tipa. MIME standard je opsežan, stoga praktički ne postoje ograničenja za podatke koji se mogu prenijeti u međuspremnik. (Rasprava o MIME standardu izvan je dosega ovog članka, ali dodatne informacije možete pronaći u odjeljku Resursi.)

Kao primjer arome podataka, naći ćete da StringSelectionklasa ima dva okusa na temelju MIME vrsta. Na implementaciji je "application / x-java-serialized-object", a drugi je "text / plain; charset = unicode". U stvari, ova nam implementacija govori da tekst iz međuspremnika možemo dohvatiti kao Stringklasu ( application/x-java-serialized-object) ili kao običan tekst ( text/plain; charset=unicode).

Postoje dva načina za stvaranje a DataFlavor. Možete napisati:

public DataFlavor (representationClass, String humanRepresentationName)

Ovaj konstruktor stvorit će novi okus podataka koji predstavlja Java klasu. Vraćeni DataFlavorće imati representationClass = representationClassi a mimeType = application/x-java-serialized-object. Kao primjer, sljedeće bi stvorilo a DataFlavorza java.awt.Button:

DataFlavor (Class.forName ("java.awt.Button"), "AWT Button");

Sad, ovaj drugi konstruktor

public DataFlavor (String mimeType, String humanRepresentationName)

konstruirat će DataFlavorpomoću a MimeType. Vraćeno DataFlavorće se temeljiti na MimeType. Ako MimeTypeje application/x-java-serialized-object, tada će rezultat biti isti kao da ste pozvali prethodni konstruktor. Ipak, vraćeni DataFlavorće biti representationClass= InputStream and mimeType =mimeType. Kao primjer, sljedeći poziv stvorio bi okus običnog teksta:

public DataFlavor ("text/plain; charset=unicode", "Unicode");

Sljedeća tablica prikazuje metode DataFlavorklase.

Klasa DataFlavor
Metode Opis
boolean equals (DataFlavor) Testirajte je li isporučeni DataFlavor jednak DataFlavoru koji predstavlja ova klasa
String getHumanPresentableName () Vratite ljudsko ime koje je moguće predstaviti za format koji predstavlja ovaj DataFlavor
void setHumanPresentableName (String) Postavite ime ljudskog predstavljanja za ovaj DataFlavor
String getMimeType () Nabavite niz MIME tipa predstavljen ovim DataFlavor
Class getRepresentationClass () Vratite klasu koja predstavlja ovu klasu

Prenosivo sučelje

TransferableSučelje mora biti proveden od strane svih klasa koje želite poslati u međuspremnik, stoga je Clipboardklasa samo da će shvatiti klase koje su zamotane od strane Transferablesučelja. TransferableSučelje se sastoji od tri načina:

Prenosivo sučelje
Metode Opis
DataFlavor getTransferDataFlavor () Vrati niz DataFlavor koji predstavlja objekt
boolean isDataFlavorSupported (DataFlavor) Testirajte je li podržani isporučeni DataFlavor
Object getTransferData (DataFlavor) Vratite objekt koji predstavlja isporučeni DataFlavor

Ovim je završen obilazak svih razreda koji su uključeni u rukovanje međuspremnikom. Vidjeli smo da da bismo pristupili međuspremniku, moramo ili stvoriti Clipboardobjekt ili dobiti referencu na sistemski međuspremnik. Budući da međuspremnik prihvaća samo objekte tipa Transferable, objekt koji želite poslati u međuspremnik mora implementirati ovo sučelje. Konačno, svi objekti u međuspremniku imaju okuse koje predstavlja DataFlavorklasa, koja je u stvari omot MIME vrsta.

U sljedećim ćemo odjeljcima primijeniti u praksi ono što smo naučili.

Recept za upotrebu međuspremnika

Način na koji ove različite klase pristupaju međuspremniku može biti zbunjujuće. Srećom, postoji jednostavan recept koji uključuje sljedeće korake:

Korak 1. Stvorite klasu nazvanu xxxxSelection . Ovdje bi xxx trebao imenovati vrstu koju predstavlja ovaj okus. Na primjer, ImageSelectionbilo bi dobro ime za okus slike. Ova konvencija imenovanja samo je prijedlog, naravno. Slijedim ustaljenu konvenciju o korištenju s StringSelectionnavedenom u JDK, ali ovoj klasi možete dodijeliti bilo što što želite. Važno je zapamtiti da je ovaj objekt mora provesti Transferablei ClipboardOwnersučelja. Ako planirate prenijeti tekst, StringSelectionumjesto njega treba koristiti nastavu.

Korak 2. Definirajte klasu za pristup međuspremniku . Za pristup lokalni pisanje, upotrijebite sljedeći poziv: Clipboard clipboard = new Clipboard ("name"). Za pristup sustavu međuspremnik peer operativni, koristite ovaj poziv umjesto: Clipboard clipboard = getToolkit ().getSystemClipboard ().

Korak 3. Postavite sadržaj međuspremnika . Da biste to učinili, upotrijebite setContentmetodu u Clipboardklasi, gdje je prvi parametar objekt koji implementira Transferable( xxxxSelectionklasa kreirana u koraku 1), a drugi parametar referenca na klasu koja poziva ovu metodu.

Korak 4. Dohvatite sadržaj međuspremnika . Koristite getContentmetodu u Clipboardnastavi. Ova će metoda vratiti klasu tipa Transferable.

Korak 5. Provedite 'operaciju rezanja' . Da biste to učinili, morate ručno izbrisati podatke nakon kopiranja u međuspremnik. Java ne pruža implementaciju izrezane operacije.

Nakon ovog kratkog obilaska klasa koje uključuju manipulaciju međuspremnikom, slijedit ćemo predloženi recept za pisanje jednostavnog apleta koji tekst prenosi u sistemski međuspremnik.

Popis 1

Ispitajmo ovaj aplet:

Popis 1

Slijedi objašnjenje pojedinih redaka koda iz popisa 1.

Redak 9: Definirajte klasu applet1kako biste proširili Appletklasu i implementirali ClipboardOwnersučelje.

Redak 17: Definirajte objekt međuspremnika.

Redak 26: Postavite objekt međuspremnika na međuspremnik operativnog sustava.

Redci 45 do 47: Primijenite jedinu metodu u ovom sučelju. U ovom članku ne koristimo lostOwnershipmetodu, već jednostavno ispisujemo poruku na konzoli. Možete eksperimentirati s ovom metodom kopiranjem nekog teksta u međuspremnik pomoću ovog apleta, a zatim kopirati nešto drugo iz druge aplikacije. Trebali biste vidjeti da se poruka o izgubljenom vlasništvu pojavljuje u Java konzoli jer je druga aplikacija prepisala podatke koji su stavljeni u međuspremnik (pomoću alata Java).

Redak 52: Definirajte klasu vrste StringSelectionkoja implementira okus tekstualnih podataka. Zatim dobivamo sadržaj polja izvornog teksta.

Redak 53: Sadržaj međuspremnika postavite na fieldContentklasu koju smo definirali u prethodnom retku. Primijetite da moramo dostaviti vlasnika ove klase, u ovom slučaju, ovog apleta.

Redak 61: Definirajte objekt tipa koji Transferableće primati sadržaj međuspremnika.

Redak 63: Potvrdite dvije stvari. Prvo, je li međuspremnik prazan? Drugo, je li sadržaj međuspremnika pravi okus? U ovom slučaju tražimo stringFlavor.

Redak 67: Dohvatite sadržaj međuspremnika u varijabli niza. Da bismo to učinili, nazivamo getTransferDatametodu s potrebnim okusom. U ovom slučaju trebamo DataFlavor.stringFlavortip.

Redak 69: Postavite sadržaj odredišnog tekstualnog polja na sadržaj međuspremnika.

Možete eksperimentirati s ovim apletom prijenosom teksta između ovog apleta i drugog Java apleta ili između Java apleta i izvornog programa, poput Bilježnice, za one koji koriste Microsoft Windows.

Popis 2

U drugom ćemo primjeru napisati aplet koji kopira sliku u međuspremnik. Slika će implementirati vlastiti okus.

Popis 2

Slijedi objašnjenje pojedinih redaka koda u popisu 2.

Redak 27: Stvorite objekt međuspremnika koji se odnosi na lokalni međuspremnik.

Redak 41: Postavite sourImagekontrolu na Image.gif.

Redci 44 do 50: Primijenite lostOwnershipmetodu. Jednostavno ispisujemo poruku na Java konzoli.

6. redak: Stvorite ImageSelectionobjekt na temelju slike u sourceImagekontroli.

Redak 57: Postavite sadržaj međuspremnika s ImageSelectionobjektom.

Redak 66: Dohvatite sadržaj međuspremnika.

Redak 68: Osigurajte da sadržaj nije ništavan i da je podržana aroma koju tražimo.

Redak 71: Dobijte podatke u odgovarajućem okusu.

Redak 72: Postavite destinationImagekontrolu na upravo dobiveni sadržaj.

Redak 90: Definirajte ImageSelectionrazred.

Redak 93: Definirajte niz DataFlavorpozvanih supportedFlavorss jednim elementom ( imageFlavor).

Linija 102: Stvorite okus slike. Stvoreni okus temelji se na java.awt.Imagepredstavničkom imenu "Slika".

Redci 111 do 130: Primijeniti Transferablemetode.

Redak 123: Vratite sadržaj međuspremnika ovom metodom.

Redak 125: Potvrdite okus. Ako je traženi okus podržan, objekt slike se vraća. Inače se izuzima iznimka.

U Popisu 1 koristili smo zadani okus podataka ( StringSelection) za slanje teksta u međuspremnik sustava. U Popisu 2 otišli smo dalje implementirajući vlastiti okus podataka java.awt.Image.