Ohjelmointi

Java-vinkki 61: Leikkaa, kopioi ja liitä Java

Tämä artikkeli antaa sinulle hyvän käsityksen siitä, miten tietoja voidaan lähettää ja saada leikepöydältä Java-käyttöjärjestelmässä. Opit myös käsittelemään erilaisia ​​saatavilla olevia makuja. Lopuksi käsitellään leikepöydän useita persoonallisuuksia ja sitä, miten ne tarjoavat tukea useammalle kuin yhdelle data-makulle.

Java tarjoaa kahdenlaisia ​​leikepöytiä: paikalliset ja järjestelmä. Paikalliset leikepöydät ovat käytettävissä vain virtuaalikoneessa, jossa sovelma tai sovellus on käynnissä. Toisin kuin jotkut käyttöjärjestelmät, jotka rajoittavat sinut vain yhteen leikepöydään, Java antaa sinulle mahdollisuuden käyttää niin monta paikallista leikepöytää kuin haluat. Tietyn paikallisen leikepöydän käyttö on yhtä helppoa kuin viittaaminen siihen nimellä.

Järjestelmän leikepöydät ovat suoraan yhteydessä vertaiskäyttöjärjestelmään, jolloin sovelluksesi voi siirtää tietoja kaikkien kyseisessä käyttöjärjestelmässä toimivien sovellusten välillä. Yksi haitta järjestelmän leikepöydän käytöstä on, että voit siirtää vain tekstidataa. Järjestelmän leikepöytä ei tue muun tyyppisiä objekteja. Onneksi tämä asia käsitellään JDK: n seuraavassa julkaisussa.

Ennen kuin menemme pidemmälle, katsotaanpa kaikki leikepöydän manipuloinnissa mukana olevat luokat. Nämä alla olevassa taulukossa luetellut luokat ovat kaikki osa luokkaa java.awt.datatransfer paketti.

Luettelo kaikista paketissa java.awt.datatransfer olevista luokista
NimiTyyppiKuvaus
LeikepöytäLuokkaKäsittelee kaikkea, mikä on siirrettävissä
LeikepöytäOmistajaKäyttöliittymäJokaisen leikepöytää käsittelevän luokan on toteutettava tämä käyttöliittymä. Tätä liitäntää käytetään ilmoittamaan, kun leikepöydälle alun perin asetetut tiedot on korvattu
DataflavorLuokkaEdustaa kaikkia siirrettävissä olevia tietotyyppejä
MerkkijonoValintaLuokkaYksi siirrettävien laitteiden tyyppi, joka toimitetaan Java-ohjelmiston mukana
SiirrettävissäKäyttöliittymäLeikepöydälle siirrettyjen esineiden kääre
Ei tuettu maku PoikkeusLuokkaSiirrettävän poikkeus, jota ei tueta

Lisää leikepöydän luokista

Mennään syvemmälle java.awt.datatransfer pakettia tarkastelemalla yksityiskohtaisesti kutakin luokkaa.

Leikepöytä-luokka

Leikepöytä luokka on linkki leikepöydälle. Se sisältää kolme menetelmää, jotka on määritelty seuraavassa taulukossa:

Leikepöydän luokka
MenetelmäKuvaus
Merkkijono getName ()Hanki leikepöydän nimi
void setContents (siirrettävä, leikepöydän omistaja)Aseta leikepöydän sisältö yhdessä omistajaobjektin kanssa
Siirrettävä getContent (objekti)Hanki leikepöydän sisältö siirrettävän objektin muodossa. Parametrina välitetty objekti on omistaja

Kolme Leikepöytä Yllä olevien luokan menetelmien avulla voit nimetä leikepöydän, lähettää sille tietoja tai saada siitä tietoja. Järjestelmän leikepöydälle pääsy tai paikallisen leikepöydän luominen on erilaista ja vaatii hieman enemmän keskustelua. Määritä järjestelmän leikepöydälle viittaus järjestelmän leikepöydältä Leikepöytä luokka, kuten:

Leikepöydän leikepöytä = getToolkit () .getSystemClipboard ();

Toisaalta, jotta voit luoda paikallisen leikepöydän, sinun tarvitsee vain luoda Leikepöytä objekti, jonka nimen haluat määrittää sille, esimerkiksi:

Leikepöydän leikepöytä = uusi leikepöytä ("Ensimmäinen leikepöytä");

Järjestelmän leikepöydälle pääsy tai paikallisen leikepöydän luominen on erilaista, mutta suoraviivaista.

Leikepöytäomistajan käyttöliittymä

Koska Java on monitasoinen kieli ja koska käyttöjärjestelmät käyttäytyvät eri tavalla leikepöytiä kohtaan, Java-kielen kirjoittajien oli keksittävä mekanismi hienovaraisten erojen käsittelemiseksi. Tämä on syy LeikepöytäOmistaja käyttöliittymä. Sen ainoa tehtävä on ilmoittaa leikepöydän omistajalle, kun joku muu korvaa hänen tietonsa. Se voi myös antaa sovellukselle signaalin, kun dataan liittyvä resurssi vapautetaan.

Todellisessa sovelluksessa menetettyOmistaja menetelmää voidaan käyttää asettamaan lippu, joka ilmoittaa sovelluksellesi tietojen saatavuudesta leikepöydälle. Vaikka Microsoft Word ei ole kirjoitettu Java-muodossa, se on hyvä esimerkki tästä mekanismista, joka toimii sovelluksessa. Aina kun laitat jotain leikepöydälle Wordissa ja lopetat, näyttöön tulee valintaikkuna, jossa ilmoitetaan, että tiedot ovat leikepöydällä. Sitten sinulta kysytään, haluatko jättää tiedot leikepöydälle.

Ohjelman toteuttaminen LeikepöytäOmistaja käyttöliittymä on suhteellisen yksinkertainen, koska toteutettavissa on vain yksi menetelmä. Tämä menetelmä saa ohjelmasi luopumaan leikepöydän omistajuudesta.

DataFlavor-luokka

DataFlavor luokkaa käytetään edustamaan tyyppi kohteen. Et ole rajoitettu yhteen datamakuun (tai -tyyppiin) per objekti. Ja kuten meilläkin, esineilläsi voi olla useita persoonallisuuksia! Esimerkiksi kuvaluokka voidaan esittää Java-luokassa tai bittiryhmänä (GIF, JPEG ja niin edelleen). Todellisuudessa a DataFlavor luokka on MIME-tyyppinen kääre. MIME-standardi on laaja, joten leikepöydälle siirrettäville tiedoille ei ole käytännössä mitään rajoituksia. (MIME-standardia koskeva keskustelu on tämän artikkelin ulkopuolella, mutta lisätietoja on Resurssit-osassa.)

Esimerkkinä tietojen aromista huomaat, että MerkkijonoValinta luokassa on kaksi makua MIME-tyyppien perusteella. Toteutuksessa on "application / x-java-serialized-object", ja toinen on "text / plain; charset = unicode". Itse asiassa tämä toteutus kertoo meille, että voimme hakea tekstiä leikepöydältä a Merkkijono luokka (application / x-java-serialized-object) tai pelkkänä tekstinä (teksti / tavallinen; merkkisarja = unicode).

On kaksi tapaa luoda DataFlavor. Sinä voit kirjoittaa:

public DataFlavor (RepresentationClass, String humanRepresentationName)

Tämä konstruktori luo uuden data-aromin, joka edustaa Java-luokkaa. Palasi DataFlavor tulee olemaan esitysLuokka = edustusLuokka ja a mimeType = application / x-java-serialized-object. Esimerkiksi seuraava loisi a DataFlavor varten java.awt.Button:

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

Nyt tämä toinen rakentaja

public DataFlavor (String mimeType, String humanRepresentationName)

rakentaa a DataFlavor käyttää MimeType. Palasi DataFlavor perustuu MimeType. Jos MimeType On application / x-java-serialized-object, niin tulos on sama kuin jos soittaisit edelliselle konstruktorille. Palasi kuitenkin DataFlavor tulee olemaan representationClass = InputStream ja mimeType = mimeType. Esimerkiksi seuraava kutsu luo tekstimuodon:

public DataFlavor ("teksti / tavallinen; charset = unicode", "Unicode");

Seuraava taulukko esittää menetelmät DataFlavor luokassa.

DataFlavor-luokka
MenetelmätKuvaus
totuusarvo on yhtä suuri (DataFlavor)Testaa, onko toimitettu DataFlavor yhtä suuri kuin tämän luokan edustama DataFlavor
Merkkijono getHumanPresentableName ()Palauta ihmisen edustama nimi muodossa, jota tämä DataFlavor edustaa
void setHumanPresentableName (merkkijono)Aseta tälle DataFlavorille ihmisen edustuksen nimi
Merkkijono getMimeType ()Hanki MIME-tyyppinen merkkijono, jota tämä DataFlavor edustaa
Luokka getRepresentationClass ()Palauta tätä luokkaa edustava luokka

Siirrettävä käyttöliittymä

Siirrettävissä käyttöliittymä on toteutettava kaikissa luokissa, jotka haluat lähettää leikepöydälle, joten Leikepöytä luokka ymmärtää vain luokat, jotka Siirrettävissä käyttöliittymä. Siirrettävissä käyttöliittymä koostuu kolmesta menetelmästä:

Siirrettävä käyttöliittymä
MenetelmätKuvaus
DataFlavor getTransferDataFlavor ()Palauta objektia edustava taulukko DataFlavor
totuusarvo onDataFlavorSupported (DataFlavor)Testaa, tuetaanko toimitettua DataFlavoria
Objekti getTransferData (DataFlavor)Palauta toimitetun DataFlavorin edustama objekti

Tämä päättää kiertueen kaikista leikepöydän käsittelyyn osallistuvista luokista. Olemme nähneet, että leikepöydälle pääsemiseksi meidän on joko luotava Leikepöytä esine tai hanki viite järjestelmän leikepöydälle. Koska leikepöytä hyväksyy vain tyypiltään objekteja Siirrettävissä, objektin, jonka haluat lähettää leikepöydälle, on toteutettava tämä käyttöliittymä. Lopuksi kaikilla leikepöydän esineillä on makuja, joita edustaa DataFlavor luokka, joka todellisuudessa on kääre MIME-tyypeille.

Seuraavissa osioissa käytämme oppimamme käytännössä.

Resepti leikepöydän hyödyntämiseen

Kuinka nämä eri luokat pääsevät leikepöydälle, voi olla hämmentävää. Onneksi on olemassa yksinkertainen resepti, joka sisältää seuraavat vaiheet:

Vaihe 1. Luo luokka nimeltä xxxxSelection. Tässä xxx: n tulisi nimetä tyyppi, jota tämä maku edustaa. Esimerkiksi, ImageSelection olisi hyvä nimi kuvan makuun. Tämä nimeämistapa on tietysti vain ehdotus. Seuraan vakiintunutta käytäntöä MerkkijonoValinta JDK: ssa, mutta voit nimetä tämän luokan mihin tahansa. On tärkeää muistaa, että tämän objektin on toteutettava Siirrettävissä ja LeikepöytäOmistaja rajapinnat. Jos aiot siirtää tekstiä, MerkkijonoValinta luokkaa tulisi käyttää sen sijaan.

Vaihe 2. Määritä luokka, jolla pääset leikepöydälle. Voit käyttää paikallista leikepöytää käyttämällä seuraavaa puhelua: Leikepöydän leikepöytä = uusi leikepöytä ("nimi"). Käytä vertaiskäyttöjärjestelmän leikepöytää käyttämällä tätä puhelua: Leikepöydän leikepöytä = getToolkit () .getSystemClipboard ().

Vaihe 3. Aseta leikepöydän sisältö. Voit tehdä tämän käyttämällä setContent menetelmä Leikepöytä luokka, jossa ensimmäinen parametri on objekti, joka toteuttaa a Siirrettävissä (xxxxValinta luokka luodaan vaiheessa 1), ja toinen parametri on viittaus luokkaan, joka kutsuu tätä menetelmää.

Vaihe 4. Hanki leikepöydän sisältö. Käytä getContent menetelmä Leikepöytä luokassa. Tämä menetelmä palauttaa tyypin luokan Siirrettävissä.

Vaihe 5. Toteuta leikkaustoiminto. Tätä varten sinun on poistettava tiedot manuaalisesti, kun ne on kopioitu leikepöydälle. Java ei toteuta leikkaustoimintoa.

Tämän lyhyen kiertueen jälkeen luokkiin, joihin liittyy leikepöydän manipulointia, noudatamme ehdotettua reseptiä kirjoittaaksesi yksinkertaisen sovelman, joka siirtää tekstiä järjestelmän leikepöydälle.

Listaus 1

Tarkastellaan tätä applettia:

Listaus 1

Seuraava on selitys luettelon 1 tietyille koodiriveille.

Rivi 9: Määritä luokka sovelma 1 pidentää Appletti luokan ja toteuttaa LeikepöytäOmistaja käyttöliittymä.

Rivi 17: Määritä leikepöydän objekti.

Rivi 26: Aseta leikepöytäobjekti vertaiskäyttöjärjestelmän leikepöydälle.

Rivit 45–47: Toteuta ainoa menetelmä tässä käyttöliittymässä. Tässä artikkelissa emme käytä menetettyOmistaja mutta yksinkertaisesti tulosta viesti konsolille. Voit kokeilla tätä menetelmää kopioimalla tekstiä leikepöydälle tämän sovelman avulla ja kopioimalla sitten jotain muuta toisesta sovelluksesta. Kadonneen omistajuuden sanoman pitäisi näkyä Java-konsolissa, koska toinen sovellus korvasi leikepöydälle (Java-sovelman avulla) asetetut tiedot.

Rivi 52: Määritä tyypin luokka MerkkijonoValinta jotka toteuttavat tekstidatan aromin. Sitten saamme lähdetekstikentän sisällön.

Rivi 53: Aseta leikepöydän sisällöksi fieldContent luokka, jonka määritimme edellisellä rivillä. Huomaa, että meidän on toimitettava tämän luokan omistajalle, tässä tapauksessa, tämä sovelma.

Rivi 61: Määritä tyypin objekti Siirrettävissä vastaanottaa leikepöydän sisältöä.

Rivi 63: Vahvista kaksi asiaa. Ensinnäkin, onko leikepöytä tyhjä? Toiseksi, onko leikepöydän sisältö oikea maku? Tässä tapauksessa etsimme a stringFlavor.

Rivi 67: Hae leikepöydän sisältö merkkijonomuuttujaan. Tätä varten kutsumme getTransferData menetelmä vaadittavalla maulla. Tässä tapauksessa tarvitsemme a DataFlavor.stringFlavor tyyppi.

Rivi 69: Aseta kohdetekstikentän sisältö leikepöydän sisältöön.

Voit kokeilla tätä sovelmaa siirtämällä tekstiä tämän sovelman ja toisen Java-sovelman välillä tai Java-sovelman ja natiiviohjelman, kuten Muistio, välillä niille, jotka käyttävät Microsoft Windowsia.

Listaus 2

Toisessa esimerkissä kirjoitamme sovelman, joka kopioi kuvan leikepöydälle. Kuva toteuttaa oman makunsa.

Listaus 2

Seuraava on selitys luettelon 2 tietyille koodiriveille.

Rivi 27: Luo leikepöytäobjekti, joka viittaa paikalliseen leikepöydään.

Rivi 41: Aseta hapan kuva hallita Kuva.gif.

Rivit 44-50: Toteuta menetettyOmistaja menetelmä. Tulostamme yksinkertaisesti viestin Java-konsolille.

Rivi 6: Luo ImageSelection objekti, joka perustuu sourceImage ohjaus.

Rivi 57: Aseta leikepöydän sisältö ImageSelection esine.

Rivi 66: Hanki leikepöydän sisältö.

Rivi 68: Varmista, että sisältö ei ole tyhjä ja että etsimää makua tuetaan.

Rivi 71: Hanki tiedot sopivalla maulla.

Rivi 72: Aseta määränpääKuva hallita juuri hankittua sisältöä.

Rivi 90: Määritä ImageSelection luokassa.

Rivi 93: Määritä joukko DataFlavor olla nimeltään tuetut maut yhdellä elementillä (imageFlavor).

Rivi 102: Luo kuvan maku. Luotu maku perustuu java.awt.Image esitysnimellä "Kuva".

Rivit 111-130: Toteuta Siirrettävissä menetelmiä.

Rivi 123: Palauta leikepöydän sisältö tällä menetelmällä.

Rivi 125: Vahvista maku. Jos pyydettyä makua tuetaan, kuvaobjekti palautetaan. Muussa tapauksessa heitetään poikkeus.

Luettelossa 1 käytimme oletusarvoa (MerkkijonoValinta) lähettääksesi tekstiä järjestelmän leikepöydälle. Listing 2: ssa menimme pidemmälle toteuttamalla oman datamakumme java.awt.Image.