Programování

Tip Java 61: Vyjímejte, kopírujte a vkládejte v Javě

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.datatransfer
názevTypPopis
SchránkaTřídaZabývá se vším, co je přenosné
Vlastník schránkyRozhraní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řídaPředstavuje všechny datové typy, které podporují přenos
StringSelectionTřídaJeden 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ýjimkaTřídaVý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:

Třída schránky
MetodaPopis
Ř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.

Třída DataFlavor
MetodyPopis
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:

Přenosné rozhraní
MetodyPopis
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.