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å:

  1. Skaffa en referens till Windows clipboard eller skapa ett eget.
  2. Placera datat i en Transferable. Om datat inte är en sträng måste du skriva en egen Transferable.
  3. Skicka din Transferable till ditt clipboard.
Gången för att hämta från ett clipboard är:
  1. Skaffa en referens till aktuellt clipboard.
  2. Om du vill, ta reda på om datat stöder önskad DataFlavor.
  3. Hämta clipboardet:s transferable.
  4. Hämta datat från hämtad Transferable.