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.datatransferNavn | Type | Beskrivelse |
Utklippstavle | Klasse | Avtaler med alt som er overførbart |
Utklippstavle | Grensesnitt | Hver 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 |
Dataflavor | Klasse | Representerer alle datatypene som kan overføres |
StringValg | Klasse | En type overførbar som leveres med Java |
Overførbar | Grensesnitt | Innpakning til gjenstander som sendes til utklippstavlen |
Ikke-støttet smak Unntak | Klasse | Unntak 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:
Metode | Beskrivelse |
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.
Metoder | Beskrivelse |
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:
Metoder | Beskrivelse |
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
.