Тази статия ще ви даде добро разбиране за това как да изпращате и получавате информация от клипборда в 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
класа.
Методи | Описание |
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
.