Kopiering
I AWT (och därmed i Swing) finns stöd för att kopiera
till och från såväl operativsystemets clipboard som ett
lokalt clipboard man skapar själv. Det finns bara färdig hantering
av strängar, men tämligen enkelt skriver man klasser som hanterar
andra datatyper. Först tar vi ett exempel på strängkopiering,
ClipboardTest.java. Exemplet missar lite
poängen eftersom vi kopierar från och till samma applikation.
Det går naturligtvis utmärkt att kopiera mellan olika javaprogram
och också mellan ett javaprogram, och något helt annat Windowsprogram
som använder systemets clipboard, testa själv!
Nu går vi igenom de inblandade klasserna och avslutar med ett exempel
som kopierar en JPanel, och därmed även allt en JPanel
kan innehålla. Alla inblandade klasser finns i paketet java.awt.datatransfer.
Clipboard
Denna klass symboliserar ett clipboard, och innehåller inte mycket
mer än en metod för att lägga något på det och
en metod för att hämta dess innehåll. Ett clipboard kan
endast innehålla ett objekt i taget. Antingen använder vi systemets
clipboard som vi får tag i med metoden Toolkit.getDefaultToolkit().getSystemClipboard(),
eller också skapar vi ett eget genom att instansiera ett eget objekt
av klassen Clipboard.
ClipBoardOwner
Ett interface som måste implementeras av det objekt som placerar
något på ett Clipboard. Det innehåller en enda
metod, lostOwnership(), vilken anropas när någon annan
kopierar till samma clipboard. En klass som kopierat ett objekt är skyldig
att behålla det objektet opåverkat ända tills denna metod
anropas.
DataFlavor
En DataFlavor symboliserar en viss sorts datatyp. Datatypen definieras
antingen som en javaklass eller en MIME-typ. Klassen används för
att definiera vad som finns på ett clipboard. Den innehåller
en konstant, stringFlavor, som är ett DataFlavor-objekt
som symboliserar en java.lang.String.
Transferable
Ett objekt som ska placeras på ett clipboard måste implementera
detta interface. Det innehåller en metod som returnerar det som skulle
kopieras. En Transferable fungerar alltså som en behållare
för något som placeras på ett clipboard. Transferable
innehåller också metoder som ger information om vilka DataFlavor
dess innehåll kan levereras som.
StringSelection
Den enda färdiga implementationen av Transferable. Den hanterar
strängar och anger att dess innehåll är av typen DataFlavor.stringFlavor,
se ovan.
Ett program som kopierar en JPanel
Här kommer det utlovade programmet. Det blir en del tricks med grafiken,
men vad gäller hanteringen av kopierandet är det intressanta den
nya klassen JPanelSelection. Det är en Transferable
som innehåller en JPanel. Här är exemplet, JPanelCopy.java, och här är bilden,
pernilla.jpg.
Gången för att kopiera till ett clipboard är alltså:
- Skaffa en referens till Windows clipboard eller skapa ett eget.
- Placera datat i en Transferable. Om datat inte är en
sträng måste du skriva en egen Transferable.
- Skicka din Transferable till ditt clipboard.
Gången för att hämta från ett clipboard är:
- Skaffa en referens till aktuellt clipboard.
- Om du vill, ta reda på om datat stöder önskad DataFlavor.
- Hämta clipboardet:s transferable.
- Hämta datat från hämtad Transferable.