Programmering

Java Tip 61: Klip, kopier og indsæt i Java

Denne artikel vil give dig en god forståelse af, hvordan du sender og får information fra udklipsholderen i Java. Du lærer også, hvordan du håndterer de forskellige tilgængelige data-smag. Endelig vil vi dække de mange personligheder ved udklipsholderne, og hvordan de yder support til mere end en datasmag.

Java tilbyder to typer udklipsholder: lokalt og system. Lokale udklipsholder er kun tilgængelige i den virtuelle maskine, som din applet eller applikation kører. Men i modsætning til nogle operativsystemer, der kun begrænser dig til et udklipsholder, giver Java dig mulighed for at have så mange lokale udklipsholder som du ønsker. Adgang til et bestemt lokalt udklipsholder er lige så let som at henvise til det ved navn.

Systemudklipsholder er direkte forbundet med peer-operativsystemet, så din applikation kan overføre oplysninger mellem alle applikationer, der kører under dette operativsystem. En ulempe ved at bruge systemets udklipsholder er, at du kun kan overføre tekstdata. Andre typer objekter understøttes ikke af systemets udklipsholder. Med held og lykke vil dette problem blive behandlet i den næste udgivelse af JDK.

Før vi går videre, lad os se på alle de klasser, der er involveret i manipulation af udklipsholderen. Disse klasser, der er anført i nedenstående tabel, er alle en del af java.awt.datatransfer pakke.

Liste over alle klasser i pakken java.awt.datatransfer
NavnTypeBeskrivelse
UdklipsholderKlasseBeskæftiger sig med alt, hvad der kan overføres
UdklipsholderInterfaceHver klasse, der beskæftiger sig med udklipsholderen, skal implementere denne grænseflade. Denne grænseflade bruges til at underrette, når de data, der oprindeligt blev placeret i udklipsholderen, er blevet overskrevet
DataflavourKlasseRepræsenterer alle datatyper, der kan overføres
StringValgKlasseEn type overførbar, der leveres med Java
OverførbarInterfaceIndpakning til objekter, der sendes til udklipsholderen
Ikke-understøttet smag UndtagelseKlasseUndtagelse kastet af overførbar for en ikke-understøttet datasmag

Mere om udklipsholderklasser

Lad os gå dybere ind i vores udforskning af java.awt.datatransfer pakke ved at se detaljeret på hver klasse.

Udklipsholderklassen

Det Udklipsholder klasse er dit link til adgang til udklipsholderen. Det inkluderer tre metoder, der er defineret i følgende tabel:

Udklipsholder klasse
MetodeBeskrivelse
String getName ()Få navnet på udklipsholderen
void setContents (Transferable, ClipboardOwner)Indstil indholdet af udklipsholderen sammen med ejerobjektet
Overførbart getContent (objekt)Få indholdet af udklipsholderen i form af et overførbart objekt. Objektet, der sendes som parameter, er ejeren

De tre Udklipsholder klassemetoder ovenfor giver dig mulighed for at navngive udklipsholderen, sende oplysninger til det eller få oplysninger fra det. Adgang til systemets udklipsholder eller oprettelse af et lokalt udklipsholder er anderledes og kræver lidt mere diskussion. For at få adgang til systemudklipsholderen skal du tildele en reference fra systemudklipsholderen til Udklipsholder klasse, såsom:

Udklipsholder udklipsholder = getToolkit () .getSystemClipboard ();

På den anden side skal du kun oprette et for at oprette et lokalt udklipsholder Udklipsholder objekt med det navn, du vil tildele det, for eksempel:

Udklipsholder til udklipsholder = nyt udklipsholder ("Mit første udklipsholder");

Adgang til systemudklipsholder eller oprettelse af et lokalt udklipsholder er anderledes, men ligetil.

Grænsefladen ClipboardOwner

Fordi Java er et multiplatformsprog, og fordi operativsystemer opfører sig forskelligt over for udklipsholder, måtte forfatterne af Java-sproget komme med en mekanisme til at håndtere subtile forskelle. Dette er grunden til tilstedeværelsen af Udklipsholder interface. Dens eneste funktion er at informere ejeren af ​​udklipsholderen, når hans eller hendes data overskrives af en anden. Det kan også signalere et program, hvornår der skal frigives en ressource, der er knyttet til dataene.

I en rigtig applikation, mistet ejerskab metode kunne bruges til at indstille et flag, der informerer din applikation om tilgængeligheden af ​​data i udklipsholderen. Selvom Microsoft Word ikke er skrevet i Java, er det et godt eksempel på denne mekanisme, der fungerer i en applikation. Hver gang du lægger noget i udklipsholderen i Word og derefter afslutter, vises en dialogboks, der informerer dig om, at data er i udklipsholderen. Du bliver derefter spurgt, om du vil efterlade dataene i udklipsholderen.

Implementering af Udklipsholder interface er relativt ligetil, fordi der kun er én metode til at implementere. Denne metode får dit program til at opgive ejerskabet af udklipsholderen.

DataFlavor-klassen

Det DataFlavor klasse bruges til at repræsentere type af et objekt. Du er ikke begrænset til en datasmag (eller type) pr. Objekt. Og ligesom os kan dine objekter have flere personligheder! For eksempel kan en billedklasse repræsenteres som en Java-klasse eller som en række bits (GIF, JPEG osv.). I virkeligheden er en DataFlavor klasse er en indpakning til en MIME-type. MIME-standarden er omfattende, og der er derfor næsten ingen grænser for de data, der kan overføres til udklipsholderen. (En diskussion om MIME-standarden er uden for denne artikels anvendelsesområde, men du kan finde yderligere oplysninger i afsnittet Ressourcer.)

Som et eksempel på en datasmag, vil du opdage, at StringValg klasse har to varianter baseret på MIME-typer. Ved implementering er "application / x-java-serialized-object", og det andet er "text / plain; charset = unicode". Faktisk fortæller denne implementering os, at vi kan hente tekst fra udklipsholderen som en Snor klasse (application / x-java-serialiseret-objekt) eller som almindelig tekst (tekst / almindelig; charset = unicode).

Der er to måder at oprette en DataFlavor. Du kan skrive:

public DataFlavor (representationClass, String humanRepresentationName)

Denne konstruktør opretter en ny datasmag, der repræsenterer en Java-klasse. De vendte tilbage DataFlavor vil have representationClass = representationClass og en mimeType = application / x-java-serialized-object. Som et eksempel vil følgende oprette en DataFlavor til java.awt.Knap:

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

Nu, denne anden konstruktør

public DataFlavor (String mimeType, String humanRepresentationName)

vil konstruere en DataFlavor ved hjælp af en MimeType. De vendte tilbage DataFlavor vil være baseret på MimeType. Hvis den MimeType er application / x-java-serialiseret-objekt, så bliver resultatet det samme som hvis du ringede til den forrige konstruktør. Ikke desto mindre returnerede DataFlavor vil være representationClass = InputStream og mimeType = mimeType. Som et eksempel vil følgende opkald skabe en almindelig tekstsmag:

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

Den følgende tabel viser metoderne til DataFlavor klasse.

DataFlavor klasse
MetoderBeskrivelse
boolske lig (DataFlavor)Test, om den leverede DataFlavor er lig med den DataFlavor, der er repræsenteret af denne klasse
String getHumanPresentableName ()Returner det menneskelige repræsentative navn for det format, som denne DataFlavor repræsenterer
void setHumanPresentableName (String)Indstil det menneskelige repræsentationsnavn for denne DataFlavor
String getMimeType ()Få MIME-typestrengen repræsenteret af denne DataFlavor
Klasse getRepresentationClass ()Returner den klasse, der repræsenterer denne klasse

Den overførbare grænseflade

Det Overførbar interface skal implementeres af alle klasser, som du vil sende til udklipsholderen, derfor Udklipsholder klasse vil kun forstå klasser, der er blevet pakket af Overførbar interface. Det Overførbar interface består af tre metoder:

Overførbart interface
MetoderBeskrivelse
DataFlavor getTransferDataFlavor ()Returner en matrix med DataFlavor, der repræsenterer objektet
boolsk isDataFlavorSupported (DataFlavor)Test, om den leverede DataFlavor understøttes
Objekt getTransferData (DataFlavor)Returner objektet repræsenteret af den leverede DataFlavor

Dette afslutter vores rundvisning i alle klasser, der er involveret i håndtering af udklipsholderen. Vi har set, at for at få adgang til udklipsholderen skal vi enten oprette en Udklipsholder gøre indsigelse mod eller få en henvisning til systemets udklipsholder. Fordi udklipsholderen kun accepterer objekter af typen Overførbar, det objekt, du vil sende til udklipsholderen, skal implementere denne grænseflade. Endelig har alle objekter på udklipsholderen varianter, der er repræsenteret af DataFlavor klasse, som i virkeligheden er en indpakning til MIME-typer.

I de næste afsnit vil vi gennemføre det, vi har lært.

Opskriften til udnyttelse af udklipsholderen

Hvordan disse forskellige klasser får adgang til udklipsholderen, kan være forvirrende. Heldigvis er der en simpel opskrift, der involverer følgende trin:

Trin 1. Opret en klasse kaldet xxxxSelection. Her skal xxx navngive typen repræsenteret af denne smag. For eksempel, ImageSelection ville være et godt navn for en billedsmag. Denne navngivningskonvention er selvfølgelig kun et forslag. Jeg følger den etablerede konvention om brug med StringValg leveres i JDK, men du kan navngive denne klasse hvad du vil. Det er vigtigt at huske, at dette objekt skal implementere Overførbar og Udklipsholder grænseflader. Hvis du planlægger at overføre tekst, vises StringValg klasse skal bruges i stedet.

Trin 2. Definer en klasse for at få adgang til udklipsholderen. For at få adgang til et lokalt udklipsholder skal du bruge følgende opkald: Udklipsholder udklipsholder = nyt udklipsholder ("navn"). For at få adgang til peer-operativsystemets udklipsholder skal du bruge dette opkald i stedet: Udklipsholder udklipsholder = getToolkit () .getSystemClipboard ().

Trin 3. Indstil indholdet af udklipsholderen. Brug dette til at gøre dette setContent metode i Udklipsholder klasse, hvor den første parameter er et objekt, der implementerer en Overførbar (xxxxValg klasse oprettet i trin 1), og den anden parameter er en henvisning til den klasse, der kalder denne metode.

Trin 4. Få indholdet af udklipsholderen. Brug getContent metode i Udklipsholder klasse. Denne metode returnerer en klasse af typen Overførbar.

Trin 5. Gennemfør en 'skæreoperation'. For at gøre dette skal du manuelt slette dataene, når de er kopieret til udklipsholderen. Java giver ingen implementering af en cut-operation.

Efter denne korte rundvisning i klasser, der involverer manipulation af udklipsholder, følger vi den foreslåede opskrift for at skrive en simpel applet, der overfører tekst til systemets udklipsholder.

Liste 1

Lad os undersøge denne applet:

Liste 1

Følgende er en forklaring på specifikke kodelinjer i liste 1.

Linie 9: Definer klassen applet1 at udvide Applet klasse og implementere Udklipsholder interface.

Linie 17: Definer et udklipsholderobjekt.

Linie 26: Indstil udklipsholderobjektet til udklipsholderen til operativsystemet.

Linje 45 til 47: Implementer den eneste metode i denne grænseflade. I denne artikel bruger vi ikke mistet ejerskab metode, men blot udskrive en besked på konsollen. Du kan eksperimentere med denne metode ved at kopiere noget tekst til udklipsholderen ved hjælp af denne applet og derefter kopiere noget andet fra et andet program. Du skal se beskeden om mistet ejerskab vises i Java-konsollen, fordi de data, der blev placeret i udklipsholderen (ved hjælp af Java-appleten) blev overskrevet af det andet program.

Linje 52: Definer en klasse af typen StringValg der implementerer en tekstdata-smag. Vi får derefter indholdet af kildetekstfeltet.

Linje 53: Indstil udklipsholderens indhold til fieldContent klasse, som vi definerede på den forrige linje. Bemærk, at vi skal levere ejeren af ​​denne klasse, i dette tilfælde denne applet.

Linje 61: Definer et objekt af typen Overførbar for at modtage indholdet på udklipsholderen.

Linie 63: Valider to ting. For det første er udklipsholderen tom? For det andet, er indholdet af udklipsholderen den rigtige smag? I dette tilfælde leder vi efter en strengFlavor.

Linje 67: Få indholdet af udklipsholderen i en strengvariabel. For at gøre dette kalder vi getTransferData metode med den krævede smag. I dette tilfælde har vi brug for en DataFlavor.stringFlavor type.

Linie 69: Indstil indholdet af destinationstekstfeltet til indholdet på udklipsholderen.

Du kan eksperimentere med denne applet ved at overføre tekst mellem denne applet og en anden Java-applet eller mellem en Java-applet og et oprindeligt program som Notesblok til dem, der kører Microsoft Windows.

Liste 2

I det andet eksempel skriver vi en applet, der kopierer et billede til udklipsholderen. Billedet implementerer sin egen smag.

Liste 2

Følgende er en forklaring på specifikke kodelinjer i liste 2.

Linie 27: Opret et udklipsholderobjekt, der refererer til et lokalt udklipsholder.

Linie 41: Indstil sourImage kontrol til Image.gif.

Linje 44 til 50: Implementere mistet ejerskab metode. Vi udskriver simpelthen en besked på Java-konsollen.

Linie 6: Opret en ImageSelection objekt baseret på billedet i sourceImage styring.

Linie 57: Indstil indholdet på udklipsholderen med ImageSelection objekt.

Linie 66: Få indholdet af udklipsholderen.

Linje 68: Sørg for, at indholdet ikke er ugyldigt, og at den smag, vi leder efter, understøttes.

Linie 71: Få dataene i den passende smag.

Linje 72: Indstil destinationImage kontrol til det netop opnåede indhold.

Linie 90: Definer ImageSelection klasse.

Linie 93: Definer en matrix af DataFlavor hedder understøttede flavours med et element (imageFlavor).

Linie 102: Opret billedets smag. Den skabte smag er baseret på java.awt.billede med repræsentationsnavnet "Image".

Linje 111 til 130: Implementere Overførbar metoder.

Linie 123: Returner indholdet af udklipsholderen med denne metode.

Linie 125: Valider smagen. Hvis den anmodede smag understøttes, returneres billedobjektet. Ellers kastes en undtagelse.

I liste 1 brugte vi standarddatasmagen (StringValg) for at sende tekst til systemets udklipsholder. I liste 2 gik vi længere ved at implementere vores egen datasmag java.awt.billede.