Programmering

Java Tips 61: Klipp, kopier og lim inn i Java

Denne artikkelen vil gi deg en god forståelse av hvordan du sender og får informasjon fra utklippstavlen i Java. Du lærer også hvordan du skal håndtere de forskjellige datasmakene som er tilgjengelige. Til slutt vil vi dekke de mange personlighetene til utklippstavlene og hvordan de gir støtte for mer enn én datasmak.

Java tilbyr to typer utklippstavler: lokalt og system. Lokale utklippstavler er bare tilgjengelige på den virtuelle maskinen som appleten eller applikasjonen kjører. Imidlertid, i motsetning til noen operativsystemer som begrenser deg til bare ett utklippstavle, lar Java deg ha så mange lokale utklippstavler som du ønsker. Å få tilgang til et bestemt lokalt utklippstavle er like enkelt som å referere til det ved navn.

System utklippstavler er direkte knyttet til peer-operativsystemet, slik at applikasjonen din kan overføre informasjon mellom alle applikasjoner som kjører under det operativsystemet. En ulempe med å bruke systemutklippstavlen er at du bare kan overføre tekstdata. Andre typer objekter støttes ikke av systemutklippstavlen. Med hell, vil dette problemet bli behandlet i neste utgivelse av JDK.

Før vi går videre, la oss ta en titt på alle klassene som er involvert i å manipulere utklippstavlen. Disse klassene, oppført i tabellen nedenfor, er alle en del av java.awt.datatransfer pakke.

Liste over alle klassene i pakken java.awt.datatransfer
NavnTypeBeskrivelse
UtklippstavleKlasseAvtaler med alt som er overførbart
UtklippstavleGrensesnittHver klasse som arbeider med utklippstavlen, må implementere dette grensesnittet. Dette grensesnittet brukes til å varsle når dataene som opprinnelig ble plassert i utklippstavlen, har blitt overskrevet
DataflavorKlasseRepresenterer alle datatypene som kan overføres
StringValgKlasseEn type overførbar som leveres med Java
OverførbarGrensesnittInnpakning til gjenstander som sendes til utklippstavlen
Ikke-støttet smak UnntakKlasseUnntak kastet av overførbart for en ikke-støttet datasmak

Mer om utklippstavlekursene

La oss gå dypere inn i utforskningen vår av java.awt.datatransfer pakke ved å se i detalj på hver klasse.

Klippebordklassen

De Utklippstavle klasse er din lenke til tilgang til utklippstavlen. Den inkluderer tre metoder, som er definert i følgende tabell:

Utklippstavlekurs
MetodeBeskrivelse
String getName ()Få navnet på utklippstavlen
void setContents (Transferable, ClipboardOwner)Sett innholdet på utklippstavlen sammen med eierobjektet
Overførbar getContent (Object)Få innholdet på utklippstavlen i form av et overførbart objekt. Objektet som sendes som parameter er eieren

De tre Utklippstavle klassemetoder ovenfor lar deg navngi utklippstavlen, sende informasjon til den eller få informasjon fra den. Å få tilgang til systemutklippstavlen eller opprette et lokalt utklippstavle er annerledes og krever litt mer diskusjon. For å få tilgang til systemutklippstavlen, tilordne en referanse fra systemutklippstavlen til Utklippstavle klasse, for eksempel:

Utklippstavle utklippstavle = getToolkit () .getSystemClipboard ();

På den annen side, for å lage et lokalt utklippstavle trenger du bare å lage et Utklippstavle objekt med navnet du vil tildele det, for eksempel:

Utklippstavle utklippstavle = nytt utklippstavle ("Mitt første utklippstavle");

Å få tilgang til systemutklippstavlen eller opprette et lokalt utklippstavle er annerledes, men grei.

Grensesnittet ClipboardOwner

Fordi Java er et flerspråklig språk, og fordi operativsystemene oppfører seg annerledes mot utklippstavler, måtte forfatterne av Java-språket komme med en mekanisme for å håndtere subtile forskjeller. Dette er årsaken til tilstedeværelsen av Utklippstavle grensesnitt. Den eneste funksjonen er å informere eieren av utklippstavlen når hans eller hennes data blir overskrevet av noen andre. Det kan også signalisere et program når en ressurs tilknyttet dataene skal frigis.

I en reell applikasjon, mistet Eierskap metoden kan brukes til å sette et flagg som informerer applikasjonen om tilgjengeligheten av dataene i utklippstavlen. Selv om Microsoft Word ikke er skrevet på Java, er det et godt eksempel på denne mekanismen som fungerer i et program. Når du legger noe i utklippstavlen i Word og deretter avslutter, vises en dialogboks som informerer deg om at data er i utklippstavlen. Du vil da bli spurt om du vil legge igjen dataene i utklippstavlen.

Implementering av Utklippstavle grensesnittet er relativt greit fordi det bare er en metode å implementere. Denne metoden vil føre til at programmet ditt gir fra seg eierskapet til utklippstavlen.

DataFlavor-klassen

De DataFlavor klasse brukes til å representere type av et objekt. Du er ikke begrenset til en datasmak (eller type) per objekt. Og som oss, kan objektene dine ha flere personligheter! For eksempel kan en bildeklasse bli representert som en Java-klasse eller som en rekke bits (GIF, JPEG og så videre). I virkeligheten, en DataFlavor klasse er en innpakning til en MIME-type. MIME-standarden er omfattende, derfor er det praktisk talt ingen grenser for dataene som kan overføres til utklippstavlen. (En diskusjon om MIME-standarden er utenfor omfanget av denne artikkelen, men du kan finne ytterligere informasjon i Ressurser-delen.)

Som et eksempel på en datasmak, vil du finne at StringValg klasse har to smaker basert på MIME-typer. Ved implementering er "application / x-java-serialized-object", og det andre er "text / plain; charset = unicode". Faktisk forteller denne implementeringen oss at vi kan hente tekst fra utklippstavlen som en String klasse (application / x-java-serialisert-objekt) eller som ren tekst (tekst / vanlig; charset = unicode).

Det er to måter å lage en DataFlavor. Du kan skrive:

public DataFlavor (representationClass, String humanRepresentationName)

Denne konstruktøren vil lage en ny datasmak som representerer en Java-klasse. De returnerte DataFlavor vil ha representationClass = representasjonsklass og en mimeType = application / x-java-serialisert-objekt. Som et eksempel, vil følgende opprette en DataFlavor for java.awt.-knapp:

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

Nå, denne andre konstruktøren

public DataFlavor (String mimeType, String humanRepresentationName)

vil konstruere en DataFlavor bruker en MimeType. De returnerte DataFlavor vil være basert på MimeType. Hvis den MimeType er application / x-java-serialisert-objekt, så blir resultatet det samme som om du ringte den forrige konstruktøren. Likevel returnerte DataFlavor vil være representationClass = InputStream og mimeType = mimeType. Som et eksempel vil følgende samtale skape en smak med ren tekst:

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

Tabellen nedenfor viser metodene for DataFlavor klasse.

DataFlavor-klasse
MetoderBeskrivelse
boolsk er lik (DataFlavor)Test om DataFlavor som leveres er lik DataFlavor representert av denne klassen
String getHumanPresentableName ()Returner det menneskelige representable navnet for formatet som denne DataFlavor representerer
void setHumanPresentableName (String)Angi navnet på den menneskelige representasjonen for denne DataFlavor
String getMimeType ()Få MIME-typen streng representert av denne DataFlavor
Class getRepresentationClass ()Returner klassen som representerer denne klassen

Det overførbare grensesnittet

De Overførbar grensesnittet må implementeres av alle klasser du vil sende til utklippstavlen, derav Utklippstavle klasse vil bare forstå klasser som er pakket inn av Overførbar grensesnitt. De Overførbar grensesnittet består av tre metoder:

Overførbart grensesnitt
MetoderBeskrivelse
DataFlavor getTransferDataFlavor ()Returner en matrise med DataFlavor som representerer objektet
boolsk isDataFlavorSupported (DataFlavor)Test om den medfølgende DataFlavor støttes
Objekt getTransferData (DataFlavor)Returner objektet representert av den medfølgende DataFlavor

Dette avslutter vår tur til alle klassene som er involvert i håndtering av utklippstavlen. Vi har sett at for å få tilgang til utklippstavlen, må vi enten lage en Utklippstavle motsette seg eller få en referanse til systemutklippstavlen. Fordi utklippstavlen godtar kun objekter av typen Overførbar, objektet du vil sende til utklippstavlen, må implementere dette grensesnittet. Til slutt har alle objekter i utklippstavlen smaker som er representert av DataFlavor klasse, som i realiteten er en innpakning til MIME-typer.

I de neste avsnittene vil vi praktisere det vi har lært.

Oppskriften på utnyttelse av utklippstavlen

Hvordan disse forskjellige klassene får tilgang til utklippstavlen kan være forvirrende. Heldigvis er det en enkel oppskrift som involverer følgende trinn:

Trinn 1. Opprett en klasse som heter xxxxSelection. Her skal xxx nevne typen som representeres av denne smaken. For eksempel, ImageSelection ville være et godt navn for en bildesmak. Denne navnekonvensjonen er selvfølgelig bare et forslag. Jeg følger den etablerte brukskonvensjonen med StringValg gitt i JDK, men du kan navngi denne klassen hva du vil. Det er viktig å huske at dette objektet må implementere Overførbar og Utklippstavle grensesnitt. Hvis du planlegger å overføre tekst, blir StringValg klasse skal brukes i stedet.

Trinn 2. Definer en klasse for å få tilgang til utklippstavlen. For å få tilgang til et lokalt utklippstavle, bruk følgende samtale: Utklippstavle utklippstavle = nytt utklippstavle ("navn"). For å få tilgang til utklippstavlen til operativsystemet, bruk denne samtalen i stedet: Utklippstavle utklippstavle = getToolkit () .getSystemClipboard ().

Trinn 3. Angi innholdet på utklippstavlen. For å gjøre dette, bruk setContent metoden i Utklippstavle klasse, der den første parameteren er et objekt som implementerer en Overførbar (xxxxValg klasse opprettet i trinn 1), og den andre parameteren er en referanse til klassen som kaller denne metoden.

Trinn 4. Få innholdet på utklippstavlen. Bruke getContent metoden i Utklippstavle klasse. Denne metoden returnerer en klasse av typen Overførbar.

Trinn 5. Implementere en "kuttoperasjon". For å gjøre dette må du slette dataene manuelt når de er kopiert til utklippstavlen. Java gir ingen implementering av en kuttoperasjon.

Etter denne korte omvisningen i klassene som involverer manipulering av utklippstavlen, følger vi den foreslåtte oppskriften for å skrive en enkel applet som overfører tekst til systemutklippstavlen.

Oppføring 1

La oss undersøke denne appleten:

Oppføring 1

Følgende er en forklaring på spesifikke kodelinjer i Listing 1.

Linje 9: Definer klassen applet1 å utvide Applet klasse og implementere Utklippstavle grensesnitt.

Linje 17: Definer et utklippstavleobjekt.

Linje 26: Sett utklippstavleobjektet til utklippstavlen til operativsystemet.

Linje 45 til 47: Implementere den eneste metoden i dette grensesnittet. I denne artikkelen bruker vi ikke mistet Eierskap metode, men bare skriv ut en melding på konsollen. Du kan eksperimentere med denne metoden ved å kopiere litt tekst til utklippstavlen ved hjelp av denne appleten, og deretter kopiere noe annet fra et annet program. Du bør se meldingen om mistet eierskap vises i Java-konsollen, fordi dataene som ble plassert i utklippstavlen (ved hjelp av Java-appleten) ble overskrevet av det andre programmet.

Linje 52: Definer en klasse av typen StringValg som implementerer en tekstdata smak. Vi får da innholdet i kildetekstfeltet.

Linje 53: Sett innholdet på utklippstavlen til feltinnhold klasse som vi definerte på forrige linje. Legg merke til at vi må levere eieren av denne klassen, i dette tilfellet denne appleten.

Linje 61: Definer et objekt av typen Overførbar for å motta innholdet på utklippstavlen.

Linje 63: Valider to ting. For det første er utklippstavlen tom? For det andre, er innholdet på utklippstavlen den rette smaken? I dette tilfellet ser vi etter en strengFlavor.

Linje 67: Få innholdet på utklippstavlen i en strengvariabel. For å gjøre dette kaller vi getTransferData metoden med den nødvendige smaken. I dette tilfellet trenger vi en DataFlavor.stringFlavor type.

Linje 69: Sett innholdet i destinasjonstekstfeltet til innholdet på utklippstavlen.

Du kan eksperimentere med denne appleten ved å overføre tekst mellom denne appleten og en annen Java-applet, eller mellom en Java-applet og et eget program, som Notisblokk, for de som kjører Microsoft Windows.

Oppføring 2

I det andre eksemplet vil vi skrive en applet som kopierer et bilde til utklippstavlen. Bildet vil implementere sin egen smak.

Oppføring 2

Følgende er en forklaring på spesifikke kodelinjer i Listing 2.

Linje 27: Lag et utklippstavleobjekt som refererer til et lokalt utklippstavle.

Linje 41: Sett surBilde kontroll til Image.gif.

Linje 44 til 50: Implementere mistet Eierskap metode. Vi skriver ganske enkelt ut en melding på Java-konsollen.

Linje 6: Lag en ImageSelection objekt basert på bildet i sourceImage kontroll.

Linje 57: Sett innholdet på utklippstavlen med ImageSelection gjenstand.

Linje 66: Få innholdet på utklippstavlen.

Linje 68: Forsikre deg om at innholdet ikke er null, og at smaken vi leter etter støttes.

Linje 71: Få dataene i riktig smak.

Linje 72: Sett destinasjonsbilde kontroll til innholdet nettopp oppnådd.

Linje 90: Definer ImageSelection klasse.

Linje 93: Definer en rekke DataFlavor kalt støttet Smaker med ett element (imageFlavor).

Linje 102: Lag bildesmaken. Smaken som er laget er basert på java.awt.Bilde med representasjonsnavnet "Image".

Linje 111 til 130: Implementere Overførbar metoder.

Linje 123: Returner innholdet på utklippstavlen med denne metoden.

Linje 125: Valider smaken. Hvis den forespurte smaken støttes, returneres bildeobjektet. Ellers kastes et unntak.

I oppføring 1 brukte vi standard datasmak (StringValg) for å sende tekst til systemutklippstavlen. I Listing 2 gikk vi videre ved å implementere vår egen datasmak java.awt.Bilde.

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