Programovanie

Tip Java 61: Vystrihujte, kopírujte a vkladajte v prostredí Java

Tento článok vám poskytne dobré informácie o tom, ako odosielať a získavať informácie zo schránky v prostredí Java. Dozviete sa tiež, ako zaobchádzať s rôznymi dostupnými príchuťami údajov. Na záver sa budeme venovať viacerým osobnostiam schránok a tým, ako poskytujú podporu pre viac ako jednu príchuť údajov.

Java ponúka dva typy schránok: lokálne a systémové. Miestne schránky sú k dispozícii iba vo virtuálnom stroji, na ktorom je spustený váš applet alebo aplikácia. Na rozdiel od niektorých operačných systémov, ktoré vás obmedzujú iba na jednu schránku, vám však Java umožňuje mať toľko miestnych schránok, koľko chcete. Prístup k konkrétnej miestnej schránke je rovnako ľahký ako odkaz na ňu podľa názvu.

Systémové schránky sú priamo prepojené s rovnocenným operačným systémom, čo umožňuje vašej aplikácii prenášať informácie medzi akýmikoľvek aplikáciami bežiacimi v tomto operačnom systéme. Jednou z nevýhod používania systémovej schránky je, že môžete prenášať iba textové údaje. Systémová schránka nepodporuje iné typy objektov. Pri troche šťastia sa touto otázkou bude zaoberať nasledujúce vydanie JDK.

Než pôjdeme ďalej, pozrime sa na všetky triedy zapojené do manipulácie so schránkou. Všetky tieto triedy, ktoré sú uvedené v nasledujúcej tabuľke, sú súčasťou java.awt.datatransfer balíček.

Zoznam všetkých tried v balíku java.awt.datatransfer
názovTypPopis
SchránkaTriedaZaoberá sa všetkým, čo je prenosné
Vlastník schránkyRozhranieKaždá trieda, ktorá sa zaoberá schránkou, musí implementovať toto rozhranie. Toto rozhranie sa používa na oznamovanie prepísania údajov pôvodne umiestnených do schránky
Príchuť údajovTriedaPredstavuje všetky dátové typy, ktoré podporuje prenos
StringSelectionTriedaJeden typ prenosného zariadenia dodávaného s jazykom Java
PrenosnéRozhranieOvíjačka na objekty odovzdané do schránky
Nepodporovaná príchuť VýnimkaTriedaVýnimka vyvolaná prenosnosťou pre nepodporovanú príchuť údajov

Viac o triedach schránky

Poďme hlbšie do nášho skúmania java.awt.datatransfer balíček podrobným prezeraním každej triedy.

Trieda schránky

The Schránka trieda je váš odkaz na prístup do schránky. Zahŕňa tri metódy, ktoré sú definované v nasledujúcej tabuľke:

Trieda schránky
MetódaPopis
Reťazec getName ()Získajte názov schránky
void setContents (Transferable, ClipboardOwner)Nastaviť obsah schránky spolu s objektom vlastníka
Prenosný getContent (objekt)Získajte obsah schránky vo forme prenosného objektu. Objekt odovzdaný ako parameter je vlastník

Tri Schránka Metódy triedy vyššie vám umožňujú pomenovať schránku, poslať jej informácie alebo z nej získať informácie. Prístup do systémovej schránky alebo vytvorenie miestnej schránky je iný a vyžaduje trochu viac diskusie. Ak chcete získať prístup do systémovej schránky, priraďte odkaz zo systémovej schránky k Schránka triedy, ako napríklad:

Schránka schránka = getToolkit () .getSystemClipboard ();

Na druhej strane, na vytvorenie miestnej schránky stačí vytvoriť iba Schránka objekt s menom, ktoré mu chcete priradiť, napríklad:

Schránka schránka = nová schránka ("Moja prvá schránka");

Prístup do systémovej schránky alebo vytvorenie miestnej schránky je iný, ale priamy.

Rozhranie ClipboardOwner

Pretože Java je multiplatformný jazyk a pretože operačné systémy sa správajú odlišne k schránkam, museli autori jazyka Java vymyslieť mechanizmus, ktorý by sa vyrovnal s jemnými rozdielmi. To je dôvod pre prítomnosť Vlastník schránky rozhranie. Jeho jedinou funkciou je informovať majiteľa schránky, keď jeho údaje prepíše niekto iný. Môže tiež signalizovať aplikácii, kedy má uvoľniť zdroj spojený s údajmi.

V skutočnej aplikácii stratené vlastníctvo metódou môžete nastaviť príznak, ktorý vašu aplikáciu informuje o dostupnosti údajov v schránke. Program Microsoft Word, aj keď nie je napísaný v jazyku Java, je dobrým príkladom tohto mechanizmu pri práci v aplikácii. Kedykoľvek vložíte niečo do schránky v programe Word a potom skončíte, zobrazí sa dialógové okno s informáciou, že údaje sú v schránke. Potom sa zobrazí otázka, či chcete údaje ponechať v schránke.

Vykonávanie Vlastník schránky rozhranie je pomerne priame, pretože je možné implementovať iba jednu metódu. Táto metóda spôsobí, že sa váš program vzdá vlastníctva schránky.

Trieda DataFlavor

The DataFlavor trieda sa používa na reprezentáciu typu predmetu. Nie ste obmedzený na jednu dátovú príchuť (alebo typ) pre každý objekt. A rovnako ako my, aj vaše objekty môžu mať viac osobností! Napríklad trieda obrázka môže byť reprezentovaná ako trieda Java alebo ako pole bitov (GIF, JPEG atď.). V skutočnosti a DataFlavor trieda je obálka typu MIME. Štandard MIME je rozsiahly, a preto neexistujú prakticky žiadne obmedzenia týkajúce sa údajov, ktoré je možné preniesť do schránky. (Diskusia o štandarde MIME je mimo rozsahu tohto článku, ďalšie informácie však nájdete v časti Zdroje.)

Ako príklad príchute údajov zistíte, že StringSelection trieda má dve príchute založené na typoch MIME. Pri implementácii sa používa výraz „application / x-java-serialized-object“ a druhý je textový / obyčajný; charset = unicode. Táto implementácia nám hovorí, že môžeme načítať text zo schránky ako String trieda (application / x-java-serialized-object) alebo ako obyčajný text (text / obyčajný; charset = unicode).

Existujú dva spôsoby, ako vytvoriť DataFlavor. Môžeš písať:

verejná DataFlavor (reprezentáciaClass, reťazec humanRepresentationName)

Tento konštruktor vytvorí novú dátovú príchuť, ktorá predstavuje triedu Java. Vrátený DataFlavor bude mať representationClass = reprezentáciaClass a a mimeType = aplikácia / x-java-serializovaný-objekt. Napríklad nasledovné by vytvorilo a DataFlavor pre java.awt.Button:

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

Teraz, tento druhý konštruktér

public DataFlavor (String mimeType, String humanRepresentationName)

postavia a DataFlavor pomocou a MimeType. Vrátený DataFlavor bude vychádzať z MimeType. Ak MimeType je application / x-java-serialized-object, potom bude výsledok rovnaký, ako keby ste volali predchádzajúci konštruktor. Napriek tomu sa vrátil DataFlavor bude representationClass = InputStream a mimeType = mimeType. Napríklad nasledujúce volanie by vytvorilo príchuť obyčajného textu:

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

V nasledujúcej tabuľke sú uvedené metódy DataFlavor trieda.

Trieda DataFlavor
MetódyPopis
boolean equals (DataFlavor)Vyskúšajte, či sa dodaná dátová príchuť rovná dátovej príchuti predstavovanej touto triedou
Reťazec getHumanPresentableName ()Vráti ľudsky reprezentovateľný názov formátu, ktorý predstavuje táto DataFlavor
void setHumanPresentableName (reťazec)Nastavte názov ľudskej reprezentácie pre túto DataFlavor
Reťazec getMimeType ()Získajte reťazec typu MIME reprezentovaný touto DataFlavor
Trieda getRepresentationClass ()Vráti Triedu, ktorá predstavuje túto triedu

Prenosné rozhranie

The Prenosné rozhranie musia byť implementované vo všetkých triedach, ktoré chcete poslať do schránky, teda Schránka trieda bude rozumieť iba triedam, ktoré boli zabalené do Prenosné rozhranie. The Prenosné rozhranie sa skladá z troch metód:

Prenosné rozhranie
MetódyPopis
DataFlavor getTransferDataFlavor ()Vráti pole DataFlavor, ktoré predstavuje objekt
boolean isDataFlavorSupported (DataFlavor)Vyskúšajte, či je podporovaná dodávaná DataFlavor
Objekt getTransferData (DataFlavor)Vráti objekt predstavovaný dodanou DataFlavor

Týmto sa končí naša prehliadka všetkých tried zapojených do práce so schránkou. Videli sme, že aby sme sa dostali do schránky, musíme buď vytvoriť a Schránka objekt alebo získať odkaz na systémovú schránku. Pretože schránka prijíma iba objekty typu Prenosné, objekt, ktorý chcete odoslať do schránky, musí implementovať toto rozhranie. Nakoniec majú všetky objekty v schránke príchute, ktoré sú reprezentované symbolom DataFlavor triedy, čo je v skutočnosti obal pre typy MIME.

V ďalších častiach uvedieme do praxe to, čo sme sa naučili.

Recept na využitie schránky

To, ako tieto rôzne triedy pristupujú do schránky, môže byť mätúce. Našťastie existuje jednoduchý recept, ktorý zahŕňa nasledujúce kroky:

Krok 1. Vytvorte triedu s názvom xxxxSelection. Tu by xxx mal pomenovať typ predstavovaný touto príchuťou. Napríklad, ImageSelection by bolo dobrým menom pre príchuť obrázka. Táto konvencia pomenovania je samozrejme iba návrhom. Postupujem podľa zavedeného dohovoru o používaní s StringSelection poskytnuté v JDK, ale túto triedu môžete pomenovať, ako chcete. Je dôležité mať na pamäti, že tento objekt musí implementovať Prenosné a Vlastník schránky rozhrania. Ak plánujete prenos textu, StringSelection namiesto toho by sa mala použiť trieda.

Krok 2. Definujte triedu pre prístup do schránky. Do miestnej schránky sa dostanete pomocou nasledujúceho hovoru: Schránka schránka = nová schránka ("meno"). Ak chcete získať prístup do schránky peer operačného systému, použite tento hovor: Schránka schránka = getToolkit () .getSystemClipboard ().

Krok 3. Nastavte obsah schránky. Ak to chcete urobiť, použite setContent metóda v Schránka triedy, kde prvý parameter je objekt, ktorý implementuje a Prenosné (xxxxVýber triedy vytvorenej v kroku 1) a druhý parameter je odkazom na triedu volajúcu túto metódu.

Krok 4. Získajte obsah schránky. Použi getContent metóda v Schránka trieda. Táto metóda vráti triedu typu Prenosné.

Krok 5. Implementácia „operácie rezania“. Ak to chcete urobiť, musíte údaje po skopírovaní do schránky manuálne vymazať. Java neposkytuje žiadnu implementáciu operácie vystrihnutia.

Po tejto krátkej prehliadke tried, ktoré zahŕňajú manipuláciu so schránkou, sa podľa navrhovaného receptu pokúsime napísať jednoduchý applet, ktorý prenesie text do systémovej schránky.

Zoznam 1

Poďme preskúmať tento applet:

Zoznam 1

Nasleduje vysvetlenie konkrétnych riadkov kódu v zozname 1.

Riadok 9: Definujte triedu applet1 predĺžiť Applet triedy a implementovať Vlastník schránky rozhranie.

Riadok 17: Definujte objekt schránky.

Riadok 26: Nastavte objekt schránky do schránky rovnocenného operačného systému.

Riadky 45 až 47: Implementujte jedinú metódu v tomto rozhraní. V tomto článku nepoužívame stratené vlastníctvo metódou, ale jednoducho vytlačiť správu na konzolu. S touto metódou môžete experimentovať tak, že skopírujete nejaký text do schránky pomocou tohto appletu a potom skopírujete niečo iné z inej aplikácie. V konzole Java by sa mala zobraziť správa o stratenom vlastníctve, pretože údaje, ktoré boli umiestnené do schránky (pomocou appletu Java), boli prepísané inou aplikáciou.

Riadok 52: Definujte triedu typu StringSelection ktoré implementujú príchuť textových údajov. Potom dostaneme obsah poľa zdrojového textu.

Riadok 53: Nastavte obsah schránky na obsah poľa triedy, ktorú sme definovali na predchádzajúcom riadku. Upozorňujeme, že musíme dodať vlastníka tejto triedy, v tomto prípade tohto appletu.

Riadok 61: Definujte objekt typu Prenosné na príjem obsahu schránky.

Riadok 63: Potvrďte dve veci. Po prvé, je schránka prázdna? Po druhé, je obsah schránky správna príchuť? V tomto prípade hľadáme a strunová príchuť.

Riadok 67: Získajte obsah schránky v premennej reťazca. Za týmto účelom voláme getTransferData metóda s požadovanou príchuťou. V tomto prípade potrebujeme a DataFlavor.stringFlavor typu.

Riadok 69: Nastavte obsah cieľového textového poľa na obsah schránky.

S týmto appletom môžete experimentovať tak, že prenesiete text medzi týmto appletom a iným appletom Java alebo medzi appletom Java a natívnym programom, ako je napríklad Poznámkový blok, pre tých, ktorí používajú systém Microsoft Windows.

Zoznam 2

V druhom príklade napíšeme applet, ktorý skopíruje obrázok do schránky. Obrázok bude mať svoju vlastnú príchuť.

Zoznam 2

Nasleduje vysvetlenie konkrétnych riadkov kódu v zozname 2.

Riadok 27: Vytvorte objekt schránky, ktorý odkazuje na miestnu schránku.

Riadok 41: Nastaviť sourImage kontrola do Obrázok.gif.

Riadky 44 až 50: Implementovať stratené vlastníctvo metóda. Jednoducho vytlačíme správu na konzolu Java.

Riadok 6: Vytvorte ImageSelection objekt založený na obrázku v sourceImage kontrola.

Riadok 57: Nastavte obsah schránky pomocou ImageSelection objekt.

Riadok 66: Získajte obsah schránky.

Riadok 68: Zaistite, aby obsah nebol neplatný a aby bola podporovaná vôňa, ktorú hľadáme.

Riadok 71: Získajte údaje v príslušnej príchuti.

Riadok 72: Nastaviť destinationImage kontrolu nad práve získaným obsahom.

Riadok 90: Definujte ImageSelection trieda.

Riadok 93: Definujte pole DataFlavor zavolal podporované príchute s jedným prvkom (imageFlavor).

Riadok 102: Vytvorte chuť obrázka. Vytvorená príchuť je založená na java.awt.obrázok s názvom reprezentácie „Obrázok“.

Riadky 111 až 130: Implementovať Prenosné metódy.

Riadok 123: Týmto spôsobom vrátite obsah schránky.

Riadok 125: Overte príchuť. Ak je požadovaná príchuť podporovaná, vráti sa obrazový objekt. V opačnom prípade sa vyvolá výnimka.

V zozname 1 sme použili predvolenú dátovú príchuť (StringSelection) na odoslanie textu do schránky systému. V zozname 2 sme išli ďalej implementáciou našej vlastnej dátovej arómy java.awt.obrázok.

$config[zx-auto] not found$config[zx-overlay] not found