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 luokistaNimi | Tyyppi | Kuvaus |
Leikepöytä | Luokka | Käsittelee kaikkea, mikä on siirrettävissä |
LeikepöytäOmistaja | Kä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 |
Dataflavor | Luokka | Edustaa kaikkia siirrettävissä olevia tietotyyppejä |
MerkkijonoValinta | Luokka | Yksi siirrettävien laitteiden tyyppi, joka toimitetaan Java-ohjelmiston mukana |
Siirrettävissä | Käyttöliittymä | Leikepöydälle siirrettyjen esineiden kääre |
Ei tuettu maku Poikkeus | Luokka | Siirrettä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:
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.
Menetelmät | Kuvaus |
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ä:
Menetelmät | Kuvaus |
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
.