Съвет за Java 61: Изрежете, копирайте и поставете в Java

Тази статия ще ви даде добро разбиране за това как да изпращате и получавате информация от клипборда в Java. Също така ще научите как да се справяте с различните налични аромати на данни. И накрая, ще разгледаме многобройните личности на клипбордите и как те осигуряват поддръжка за повече от един вкус на данни.

Java предлага два вида клипбордове: локални и системни. Локалните клипбордове са налични само във виртуалната машина, на която работи вашият аплет или приложение. Въпреки това, за разлика от някои операционни системи, които ви ограничават само до един клипборд, Java ви позволява да имате толкова локални клипборда, колкото желаете. Достъпът до конкретен локален клипборд е толкова лесен, колкото да се препрати към него по име.

Системните клипбордове са директно свързани с равностойната операционна система, което позволява на вашето приложение да прехвърля информация между всички приложения, работещи под тази операционна система. Един недостатък на използването на системния клипборд е, че можете да прехвърляте само текстови данни. Други типове обекти не се поддържат от системния клипборд. С късмет този проблем ще бъде разгледан в следващото издание на JDK.

Преди да продължим по-нататък, нека да разгледаме всички класове, участващи в манипулирането на клипборда. Всички тези класове, изброени в таблицата по-долу, са част от пакета java.awt.datatransfer .

Списък на всички класове в пакета java.awt.datatransfer
Име Тип Описание
Clipboard Клас Справя се с всичко, което може да се прехвърля
ClipboardOwner Интерфейс Всеки клас, който се занимава с клипборда, трябва да внедри този интерфейс. Този интерфейс се използва за известяване, когато първоначално поставените в клипборда данни са заменени
Dataflavor Клас Представлява всички типове данни, които подлежат на прехвърляне
StringSelection Клас Един тип прехвърляеми, който се доставя с Java
Transferable Интерфейс Опаковка към обекти, предадени в клипборда
UnsupportedFlavor Exception Клас Изключение, предадено от прехвърляемо за неподдържан аромат на данни

Повече за класовете за клипборда

Нека да влезем по-дълбоко в нашето изследване на java.awt.datatransferпакета, като разгледаме подробно всеки клас.

Класът за клипборда

Най- Clipboardкласа е вашата връзка с достъпа до клипборда. Той включва три метода, които са дефинирани в следната таблица:

Клас на клипборда
Метод Описание
String getName () Вземете името на клипборда
void setContents (Transferable, ClipboardOwner) Задайте съдържанието на клипборда заедно с обекта на собственика
Transferable getContent (Object) Получете съдържанието на клипборда под формата на преносим обект. Обектът, предаден като параметър, е собственикът

Трите Clipboardметода на класа по-горе ви позволяват да назовавате клипборда, да му изпращате информация или да получавате информация от него. Достъпът до системния клипборд или създаването на локален клипборд е различен и изисква малко повече дискусия. За достъп до системния клипборд задайте референция от системния клипборд на Clipboardкласа, като например:

Clipboard clipboard = getToolkit ().getSystemClipboard ();

От друга страна, за да създадете локален клипборд, трябва само да създадете Clipboardобект с името, което искате да му присвоите, например:

Clipboard clipboard = new Clipboard ("My first clipboard");

Достъпът до системния клипборд или създаването на локален клипборд е различен, но ясен.

Интерфейсът на ClipboardOwner

Тъй като Java е многоплатформен език и тъй като операционните системи се държат по различен начин спрямо клипбордите, авторите на езика Java трябваше да измислят механизъм за справяне с фините разлики. Това е причината за присъствието на ClipboardOwnerинтерфейса. Неговата единствена функция е да информира собственика на клипборда, когато данните му се заменят от някой друг. Той може също така да сигнализира на приложение, когато да освободи ресурс, свързан с данните.

В реално приложение lostOwnershipметодът може да се използва за задаване на флаг, който информира вашето приложение за наличността на данните в клипборда. Microsoft Word, макар и да не е написан на Java, е добър пример за този механизъм, който работи в приложение. Всеки път, когато поставите нещо в клипборда в Word и след това излезете, се появява диалогов прозорец, който ви информира, че данните са в клипборда. След това ще бъдете попитани дали искате да оставите данните в клипборда.

Внедряването на ClipboardOwnerинтерфейса е относително просто, тъй като има само един метод за внедряване. Този метод ще накара вашата програма да се откаже от собствеността върху клипборда.

Класът DataFlavor

В DataFlavorклас се използва за представяне на вида на обекта. Не сте ограничени до един вкус (или тип) данни за обект. И като нас, вашите обекти могат да имат множество личности! Например клас на изображение може да бъде представен като клас Java или като масив от битове (GIF, JPEG и т.н.). В действителност DataFlavorкласът е обвивка към MIME тип. Стандартът MIME е обширен, поради което практически няма ограничения за данните, които могат да бъдат прехвърлени в клипборда. (Дискусия относно стандарта MIME е извън обхвата на тази статия, но можете да намерите допълнителна информация в раздела Ресурси.)

Като пример за аромат на данни ще откриете, че StringSelectionкласът има два вкуса, базирани на типовете MIME. При изпълнението е "application / x-java-serialized-object", а вторият е "text / plain; charset = unicode". Всъщност това изпълнение ни казва, че можем да извлечем текст от клипборда като Stringклас ( application/x-java-serialized-object) или като обикновен текст ( text/plain; charset=unicode).

Има два начина за създаване на DataFlavor. Можеш да пишеш:

public DataFlavor (representationClass, String humanRepresentationName)

Този конструктор ще създаде нов аромат на данни, който представлява Java клас. Върнатите DataFlavorще имат representationClass = representationClassи a mimeType = application/x-java-serialized-object. Като пример, следното ще създаде a DataFlavorза java.awt.Button:

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

Сега, този втори конструктор

public DataFlavor (String mimeType, String humanRepresentationName)

ще изгради a, DataFlavorизползвайки a MimeType. Върнатото DataFlavorще се основава на MimeType. Ако MimeTypeе application/x-java-serialized-object, тогава резултатът ще бъде същият, както ако сте извикали предишния конструктор. Независимо от това, върнатите DataFlavorще бъдат representationClass= InputStream and mimeType =mimeType. Като пример, следното обаждане би създало вкус на обикновен текст:

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

Следващата таблица показва методите на DataFlavorкласа.

Клас DataFlavor
Методи Описание
boolean equals (DataFlavor) Тествайте дали предоставеният DataFlavor е равен на DataFlavor, представен от този клас
String getHumanPresentableName () Върнете представимото от човека име за формата, който представлява този DataFlavor
void setHumanPresentableName (String) Задайте името на човешкото представяне за този DataFlavor
String getMimeType () Вземете низа от типа MIME, представен от този DataFlavor
Class getRepresentationClass () Върнете класа, който представлява този клас

Прехвърляемият интерфейс

В Transferableинтерфейса трябва да се прилагат от всички класове, които искате да изпратите в клипборда, откъдето идва и Clipboardклас ще разберете само класове, които са били обвити от Transferableинтерфейса. В Transferableинтерфейс се състои от три метода:

Преносим интерфейс
Методи Описание
DataFlavor getTransferDataFlavor () Връща масив от DataFlavor, който представлява обекта
boolean isDataFlavorSupported (DataFlavor) Тествайте дали предоставеният DataFlavor се поддържа
Object getTransferData (DataFlavor) Върнете обекта, представен от предоставения DataFlavor

Това завършва нашата обиколка на всички класове, участващи в работата с клипборда. Видяхме, че за достъп до клипборда трябва или да създадем Clipboardобект, или да получим препратка към системния клипборд. Тъй като клипбордът приема само обекти от тип Transferable, обектът, който искате да изпратите в клипборда, трябва да реализира този интерфейс. И накрая, всички обекти в клипборда имат вкусове, които са представени от DataFlavorкласа, който в действителност е обвивка за MIME типове.

В следващите раздели ще приложим на практика наученото.

Рецептата за използване на клипборда

Начинът, по който тези различни класове имат достъп до клипборда, може да обърка. За щастие има проста рецепта, която включва следните стъпки:

Стъпка 1. Създайте клас, наречен xxxxSelection . Тук xxx трябва да посочи типа, представен от този вкус. Например, ImageSelectionби било добро име за аромат на изображение. Тази конвенция за именуване е просто предложение, разбира се. Следвам установената конвенция за използване с StringSelectionпредоставената в JDK, но можете да назовете този клас каквото искате. Важно е да се помни, че този обект трябва да се приложат Transferableи ClipboardOwnerинтерфейси. Ако планирате да прехвърлите текст, StringSelectionвместо това трябва да се използва класът.

Стъпка 2. Определете клас за достъп до клипборда . За достъп до локален клипборда, използвайте следната покана: Clipboard clipboard = new Clipboard ("name"). За достъп до системата клипборда партньорската операционната, използвайте този разговор, вместо: Clipboard clipboard = getToolkit ().getSystemClipboard ().

Стъпка 3. Задайте съдържанието на клипборда . За целта използвайте setContentметода в Clipboardкласа, където първият параметър е обект, който реализира Transferable( xxxxSelectionклас, създаден в стъпка 1), а вторият параметър е препратка към класа, извикващ този метод.

Стъпка 4. Вземете съдържанието на клипборда . Използвайте getContentметода в Clipboardкласа. Този метод ще върне клас от тип Transferable.

Стъпка 5. Приложете „операция за изрязване“ . За да направите това, трябва ръчно да изтриете данните, след като бъдат копирани в клипборда. Java не осигурява изпълнение на операция за изрязване.

След тази кратка обиколка на класовете, включващи манипулация с клипборда, ще следваме предложената рецепта, за да напишем прост аплет, който прехвърля текст в системния клипборд.

Листинг 1

Нека разгледаме този аплет:

Листинг 1

По-долу е обяснение на конкретни редове код в Листинг 1.

Ред 9: Дефинирайте класа, за applet1да разширите Appletкласа и да приложите ClipboardOwnerинтерфейса.

Ред 17: Определете обект от клипборда.

Ред 26: Задайте обекта на клипборда на равностоен клипборд на операционната система.

Редове 45 до 47: Внедрете единствения метод в този интерфейс. В тази статия не използваме lostOwnershipметода, а просто отпечатваме съобщение на конзолата. Можете да експериментирате с този метод, като копирате някакъв текст в клипборда с помощта на този аплет и след това да копирате нещо друго от друго приложение. Трябва да видите съобщението за загубена собственост да се появи в конзолата на Java, тъй като данните, които са били поставени в клипборда (с помощта на аплета Java), са заменени от другото приложение.

Ред 52: Дефинирайте клас от типа, StringSelectionкойто реализира вкус на текстови данни. След това получаваме съдържанието на текстовото поле на изходния текст.

Ред 53: Задайте съдържанието на клипборда на fieldContentкласа, който дефинирахме на предишния ред. Забележете, че трябва да предоставим на собственика на този клас, в този случай този аплет.

Ред 61: Определете обект от тип, за Transferableда получите съдържанието на клипборда.

Ред 63: Проверете две неща. Първо, клипбордът празен ли е? Второ, съдържанието на клипборда правилно ли е? В този случай ние търсим stringFlavor.

Ред 67: Вземете съдържанието на клипборда в низ променлива. За целта извикваме getTransferDataметода с необходимия вкус. В този случай се нуждаем от DataFlavor.stringFlavorтип.

Ред 69: Задайте съдържанието на целевото текстово поле на съдържанието на клипборда.

Можете да експериментирате с този аплет, като прехвърлите текст между този аплет и друг аплет на Java, или между аплет на Java и вградена програма, като Notepad, за тези, които работят с Microsoft Windows.

Листинг 2

Във втория пример ще напишем аплет, който копира изображение в клипборда. Изображението ще реализира свой собствен вкус.

Листинг 2

По-долу е обяснение на конкретни редове код в Листинг 2.

Ред 27: Създайте обект на клипборда, който се позовава на локален клипборд.

Линия 41: Настройте sourImageконтролата на Image.gif.

Редове 44 до 50: Прилагане на lostOwnershipметода. Ние просто отпечатваме съобщение на Java конзолата.

Ред 6: Създайте ImageSelectionобект въз основа на изображението в sourceImageконтролата.

Ред 57: Задайте съдържанието на клипборда с ImageSelectionобекта.

Ред 66: Вземете съдържанието на клипборда.

Ред 68: Уверете се, че съдържанието не е нищожно и че ароматът, който търсим, се поддържа.

Ред 71: Вземете данните в подходящия вкус.

Ред 72: Задайте destinationImageконтролата на току-що полученото съдържание.

Ред 90: Определете ImageSelectionкласа.

Ред 93: Определете масив от DataFlavorизвикани supportedFlavorsс един елемент ( imageFlavor).

Ред 102: Създайте вкус на изображението. Създаденият вкус се основава на java.awt.Imageс името на изображението "Изображение".

Редове 111 до 130: Прилагане на Transferableметодите.

Ред 123: Върнете съдържанието на клипборда с този метод.

Ред 125: Проверете вкуса. Ако исканият вкус се поддържа, обектът на картината се връща. В противен случай се прави изключение.

В Листинг 1 използвахме аромата за данни по подразбиране ( StringSelection), за да изпратим текст в системния клипборд. В списък 2 отидохме по-далеч, като внедрихме собствения си вкус за данни java.awt.Image.