Tento článek vám poskytne dobré informace o tom, jak odesílat a získávat informace ze schránky v prostředí Java. Dozvíte se také, jak se vypořádat s různými dostupnými variantami dat. Nakonec se budeme zabývat několika osobnostmi schránky a tím, jak poskytují podporu pro více než jednu chuť dat.
Java nabízí dva typy schránek: místní a systémové. Místní schránky jsou k dispozici pouze uvnitř virtuálního počítače, na kterém je spuštěn váš applet nebo aplikace. Na rozdíl od některých operačních systémů, které vás omezují pouze na jednu schránku, vám však Java umožňuje mít tolik místních schránek, kolik chcete. Přístup ke konkrétní místní schránce je stejně snadný jako odkaz na ni podle jména.
Systémové schránky jsou přímo propojeny s rovnocenným operačním systémem, což umožňuje vaší aplikaci přenášet informace mezi aplikacemi spuštěnými v tomto operačním systému. Jednou z nevýhod používání systémové schránky je, že můžete přenášet pouze textová data. Systémové schránky jiné typy objektů nepodporují. S trochou štěstí bude tento problém vyřešen v příštím vydání JDK.
Než půjdeme dále, pojďme se podívat na všechny třídy zapojené do manipulace se schránkou. Tyto třídy uvedené v tabulce níže jsou součástí java.awt.datatransfer balík.
Seznam všech tříd v balíčku java.awt.datatransfernázev | Typ | Popis |
Schránka | Třída | Zabývá se vším, co je přenosné |
Vlastník schránky | Rozhraní | Každá třída, která pracuje se schránkou, musí toto rozhraní implementovat. Toto rozhraní slouží k upozornění na přepsání dat původně umístěných ve schránce |
Datová příchuť | Třída | Představuje všechny datové typy, které podporují přenos |
StringSelection | Třída | Jeden typ přenosného zařízení dodávaného s prostředím Java |
Přenosný | Rozhraní | Obálka k objektům předaným do schránky |
Nepodporovaná příchuť Výjimka | Třída | Výjimka vyvolaná přenositelností pro nepodporovanou chuť dat |
Více o třídách schránky
Pojďme hlouběji do našeho zkoumání java.awt.datatransfer
balíček podrobným prohlédnutím každé třídy.
Třída schránky
The Schránka
třída je váš odkaz na přístup do schránky. Zahrnuje tři metody, které jsou definovány v následující tabulce:
Metoda | Popis |
Řetězec getName () | Získejte název schránky |
void setContents (Transferable, ClipboardOwner) | Nastavit obsah schránky spolu s objektem vlastníka |
Přenosný getContent (objekt) | Získejte obsah schránky ve formě přenositelného objektu. Objekt předaný jako parametr je vlastníkem |
Strom Schránka
výše uvedené metody třídy umožňují pojmenovat schránku, odeslat do ní informace nebo z ní získat informace. Přístup do systémové schránky nebo vytvoření místní schránky se liší a vyžaduje trochu více diskuse. Pro přístup do systémové schránky přiřaďte odkaz ze systémové schránky k Schránka
třída, například:
Schránka schránky = getToolkit () .getSystemClipboard ();
Na druhou stranu, k vytvoření místní schránky stačí vytvořit pouze Schránka
objekt se jménem, které mu chcete přiřadit, například:
Schránka schránka = nová schránka ("Moje první schránka");
Přístup do systémové schránky nebo vytvoření místní schránky je jiný, ale přímý.
Rozhraní ClipboardOwner
Protože Java je multiplatformní jazyk a protože operační systémy se chovají odlišně ke schránkám, museli autoři jazyka Java přijít s mechanismem, jak se vypořádat s jemnými rozdíly. To je důvod pro přítomnost Vlastník schránky
rozhraní. Jeho jedinou funkcí je informovat vlastníka schránky, když jeho data přepisuje někdo jiný. Může také signalizovat aplikaci, kdy má uvolnit prostředek spojený s daty.
Ve skutečné aplikaci je ztracené vlastnictví
metodu lze použít k nastavení příznaku, který vaši aplikaci informuje o dostupnosti dat ve schránce. Microsoft Word, i když není napsán v Javě, je dobrým příkladem tohoto mechanismu při práci v aplikaci. Kdykoli vložíte něco do schránky v aplikaci Word a poté skončíte, zobrazí se dialogové okno s informací, že data jsou ve schránce. Poté se zobrazí dotaz, zda chcete data ponechat ve schránce.
Provádění Vlastník schránky
rozhraní je relativně jednoduché, protože existuje pouze jedna metoda implementace. Tato metoda způsobí, že se váš program vzdá vlastnictví schránky.
Třída DataFlavor
The DataFlavor
třída se používá k reprezentaci typ objektu. Nejste omezeni na jednu datovou variantu (nebo typ) na objekt. A stejně jako my, i vaše objekty mohou mít více osobností! Například třída obrázku může být reprezentována jako třída Java nebo jako řada bitů (GIF, JPEG atd.). Ve skutečnosti a DataFlavor
třída je obálka typu MIME. Standard MIME je rozsáhlý, a proto neexistují prakticky žádná omezení dat, která lze přenést do schránky. (Diskuse o standardu MIME je mimo rozsah tohoto článku, ale další informace najdete v části Zdroje.)
Jako příklad datové příchuti zjistíte, že StringSelection
třída má dvě příchutě založené na typech MIME. Při implementaci je použit „application / x-java-serialized-object“ a druhý je „text / plain; charset = unicode“. Ve skutečnosti nám tato implementace říká, že můžeme načíst text ze schránky jako Tětiva
třída (application / x-java-serialized-object
) nebo jako prostý text (text / prostý; charset = unicode
).
Existují dva způsoby, jak vytvořit DataFlavor
. Můžeš psát:
public DataFlavor (representationClass, String humanRepresentationName)
Tento konstruktor vytvoří novou chuť dat, která představuje třídu Java. Vrátil se DataFlavor
budu mít zastoupeníClass = zastoupeníClass
a mimeType = application / x-java-serialized-object
. Jako příklad by následující vytvořil a DataFlavor
pro Tlačítko java.awt
:
DataFlavor (Class.forName ("java.awt.Button"), "tlačítko AWT");
Tento druhý konstruktor
public DataFlavor (String mimeType, String humanRepresentationName)
postaví a DataFlavor
používat MimeType
. Vrátil se DataFlavor
bude vycházet z MimeType
. Pokud MimeType
je application / x-java-serialized-object
, pak bude výsledek stejný, jako kdybyste volali předchozí konstruktor. Nicméně se vrátil DataFlavor
bude representationClass = InputStream a mimeType = mimeType
. Jako příklad by následující volání vytvořilo chuť prostého textu:
public DataFlavor ("text / plain; charset = unicode", "Unicode");
Následující tabulka ukazuje metody DataFlavor
třída.
Metody | Popis |
boolean se rovná (DataFlavor) | Vyzkoušejte, zda se dodaná DataFlavor rovná DataFlavoru představovanému touto třídou |
Řetězec getHumanPresentableName () | Vrátí lidský reprezentativní název pro formát, který tato DataFlavor představuje |
void setHumanPresentableName (řetězec) | Nastavte název lidské reprezentace pro tuto DataFlavor |
Řetězec getMimeType () | Získejte řetězec typu MIME představovaný touto DataFlavor |
Třída getRepresentationClass () | Vrátí třídu, která představuje tuto třídu |
Přenosné rozhraní
The Přenosný
rozhraní musí být implementováno všemi třídami, které chcete odeslat do schránky, tedy Schránka
třída bude rozumět pouze třídám, které byly zabaleny Přenosný
rozhraní. The Přenosný
rozhraní se skládá ze tří metod:
Metody | Popis |
DataFlavor getTransferDataFlavor () | Vrátí pole DataFlavor, které představuje objekt |
boolean isDataFlavorSupported (DataFlavor) | Vyzkoušejte, zda je podporovaná dodaná DataFlavor |
Objekt getTransferData (DataFlavor) | Vrátí objekt představovaný dodanou DataFlavor |
Tím končí naše prohlídka všech tříd zapojených do manipulace se schránkou. Viděli jsme, že pro přístup do schránky musíme buď vytvořit a Schránka
objekt nebo získat odkaz na systémovou schránku. Protože schránka přijímá pouze objekty typu Přenosný
, objekt, který chcete odeslat do schránky, musí implementovat toto rozhraní. Nakonec všechny objekty ve schránce mají příchutě, které jsou reprezentovány znakem DataFlavor
třída, která je ve skutečnosti obálkou typů MIME.
V následujících částech uvedeme do praxe to, co jsme se naučili.
Recept na využití schránky
To, jak tyto různé třídy přistupují ke schránce, může být matoucí. Naštěstí existuje jednoduchý recept, který zahrnuje následující kroky:
Krok 1. Vytvořte třídu s názvem xxxxSelection. Zde by xxx měl pojmenovat typ představovaný touto příchutí. Například, ImageSelection
by bylo dobré jméno pro chuť obrázku. Tato konvence pojmenování je samozřejmě pouze návrhem. Řídím se zavedenou konvencí používání s StringSelection
poskytované v JDK, ale tuto třídu můžete pojmenovat, jak chcete. Je důležité si uvědomit, že tento objekt musí implementovat Přenosný
a Vlastník schránky
rozhraní. Pokud plánujete přenést text, StringSelection
místo toho by měla být použita třída.
Krok 2. Definujte třídu pro přístup do schránky. Pro přístup k místní schránce použijte následující hovor: Schránka schránka = nová schránka ("jméno")
. Pro přístup do schránky peer operačního systému použijte místo toho toto volání: Schránka schránky = getToolkit () .getSystemClipboard ()
.
Krok 3. Nastavte obsah schránky. K tomu použijte setContent
metoda v Schránka
třída, kde první parametr je objekt, který implementuje a Přenosný
(xxxxVýběr
třída vytvořená v kroku 1) a druhý parametr je odkaz na třídu volající tuto metodu.
Krok 4. Získejte obsah schránky. Použijte getContent
metoda v Schránka
třída. Tato metoda vrátí třídu typu Přenosný
.
Krok 5. Implementujte „operaci řezu“. Chcete-li to provést, musíte data po zkopírování do schránky ručně vymazat. Java neposkytuje žádnou implementaci operace vyjmutí.
Po této krátké prohlídce tříd zahrnujících manipulaci se schránkou se budeme řídit doporučeným receptem, jak napsat jednoduchý applet, který přenese text do systémové schránky.
Výpis 1
Podívejme se na tento applet:
Výpis 1
Následuje vysvětlení konkrétních řádků kódu v seznamu 1.
Řádek 9: Definujte třídu applet1
rozšířit Applet
třídy a implementovat Vlastník schránky
rozhraní.
Řádek 17: Definujte objekt schránky.
Řádek 26: Nastavte objekt schránky do schránky peer operačního systému.
Řádky 45 až 47: Implementujte jedinou metodu v tomto rozhraní. V tomto článku nepoužíváme ztracené vlastnictví
metoda, ale jednoduše vytisknout zprávu na konzoli. S touto metodou můžete experimentovat tak, že zkopírujete nějaký text do schránky pomocí tohoto appletu a poté zkopírujete něco jiného z jiné aplikace. V konzole Java byste měli vidět zprávu o ztraceném vlastnictví, protože data vložená do schránky (pomocí appletu Java) byla přepsána jinou aplikací.
Řádek 52: Definujte třídu typu StringSelection
které implementují chuť textových dat. Poté získáme obsah pole zdrojového textu.
Řádek 53: Nastavte obsah schránky na obsah pole
třída, kterou jsme definovali na předchozím řádku. Všimněte si, že musíme dodat vlastníka této třídy, v tomto případě tohoto appletu.
Řádek 61: Definujte objekt typu Přenosný
přijímat obsah schránky.
Řádek 63: Ověřte dvě věci. Nejprve je schránka prázdná? Zadruhé, je obsah schránky tou správnou příchutí? V tomto případě hledáme a stringFlavor
.
Řádek 67: Získejte obsah schránky v řetězcové proměnné. K tomu voláme getTransferData
metoda s požadovanou příchutí. V tomto případě potřebujeme DataFlavor.stringFlavor
typ.
Řádek 69: Nastavte obsah cílového textového pole na obsah schránky.
S tímto appletem můžete experimentovat přenosem textu mezi tímto appletem a jiným appletem Java nebo mezi appletem Java a nativním programem, jako je Poznámkový blok, pro ty, kteří používají Microsoft Windows.
Výpis 2
Ve druhém příkladu napíšeme applet, který zkopíruje obrázek do schránky. Obrázek bude implementovat svou vlastní chuť.
Výpis 2
Následuje vysvětlení konkrétních řádků kódu ve výpisu 2.
Řádek 27: Vytvořte objekt schránky, který odkazuje na místní schránku.
Řádek 41: Nastav sourImage
ovládání Obrázek.gif
.
Řádky 44 až 50: Proveďte ztracené vlastnictví
metoda. Jednoduše vytiskneme zprávu na konzole Java.
Řádek 6: Vytvořit ImageSelection
objekt založený na obrázku v souboru sourceImage
řízení.
Řádek 57: Nastavte obsah schránky pomocí ImageSelection
objekt.
Řádek 66: Získejte obsah schránky.
Řádek 68: Ujistěte se, že obsah není null a že je podporována chuť, kterou hledáme.
Řádek 71: Získejte data v příslušné chuti.
Řádek 72: Nastav destinationImage
kontrolu nad právě získaným obsahem.
Řádek 90: Definujte ImageSelection
třída.
Řádek 93: Definujte pole DataFlavor
volala podporované příchutě
s jedním prvkem (imageFlavor
).
Řádek 102: Vytvořte chuť obrázku. Vytvořená příchuť je založena na java.awt. obrázek
s názvem reprezentace „Obrázek“.
Řádky 111 až 130: Proveďte Přenosný
metody.
Řádek 123: Pomocí této metody vraťte obsah schránky.
Řádek 125: Ověřte chuť. Pokud je požadovaná příchuť podporována, vrátí se objekt obrázku. Jinak je vyvolána výjimka.
V seznamu 1 jsme použili výchozí datovou příchuť (StringSelection
) k odeslání textu do systémové schránky. V seznamu 2 jsme šli dále implementací naší vlastní datové varianty java.awt. obrázek
.