Tip Java 61: Potong, salin, dan tempel di Java

Artikel ini akan memberi Anda pemahaman yang baik tentang cara mengirim dan mendapatkan informasi dari clipboard di Java. Anda juga akan belajar bagaimana menangani berbagai jenis data yang tersedia. Terakhir, kita akan membahas berbagai kepribadian papan klip dan bagaimana mereka memberikan dukungan untuk lebih dari satu ragam data.

Java menawarkan dua jenis papan klip: lokal dan sistem. Papan klip lokal hanya tersedia di dalam mesin virtual tempat applet atau aplikasi Anda berjalan. Namun, tidak seperti beberapa sistem operasi yang membatasi Anda hanya pada satu papan klip, Java memungkinkan Anda memiliki papan klip lokal sebanyak yang Anda inginkan. Mengakses papan klip lokal tertentu semudah merujuknya dengan namanya.

Papan klip sistem secara langsung ditautkan dengan sistem operasi rekan, memungkinkan aplikasi Anda mentransfer informasi di antara aplikasi apa pun yang berjalan di bawah sistem operasi itu. Salah satu kerugian menggunakan papan klip sistem adalah Anda hanya dapat mentransfer data teks. Jenis objek lain tidak didukung oleh papan klip sistem. Jika beruntung, masalah ini akan dibahas di rilis JDK berikutnya.

Sebelum melangkah lebih jauh, mari kita lihat semua kelas yang terlibat dalam memanipulasi papan klip. Kelas-kelas ini, tercantum pada tabel di bawah, semuanya adalah bagian dari paket java.awt.datatransfer .

Daftar semua kelas dalam paket java.awt.datatransfer
Nama Tipe Deskripsi
Clipboard Kelas Berurusan dengan segala sesuatu yang dapat ditransfer
ClipboardOwner Antarmuka Setiap kelas yang berhubungan dengan clipboard harus mengimplementasikan antarmuka ini. Antarmuka ini digunakan untuk memberi tahu ketika data yang awalnya ditempatkan di papan klip telah ditimpa
Dataflavor Kelas Merepresentasikan semua tipe data yang mendukung transfer
StringSelection Kelas Salah satu jenis transferable yang disertakan dengan Java
Transferable Antarmuka Wrapper ke objek yang diteruskan ke clipboard
UnsupportedFlavor Exception Kelas Pengecualian diberikan oleh transferable untuk ragam data yang tidak didukung

Lebih lanjut tentang kelas papan klip

Mari selami lebih dalam eksplorasi java.awt.datatransferpaket kami dengan melihat secara detail di setiap kelas.

Kelas Clipboard

The Clipboardkelas Link Anda mengakses clipboard. Ini mencakup tiga metode, yang ditentukan dalam tabel berikut:

Kelas papan klip
metode Deskripsi
String getName () Dapatkan nama clipboard
void setContents (Transferable, ClipboardOwner) Setel konten clipboard bersama dengan objek pemilik
Transferable getContent (Object) Dapatkan konten clipboard dalam bentuk objek yang dapat ditransfer. Objek yang dilewatkan sebagai parameter adalah pemiliknya

Tiga Clipboardmetode kelas di atas memungkinkan Anda menamai papan klip, mengirim informasi ke sana, atau mendapatkan informasi darinya. Mengakses papan klip sistem atau membuat papan klip lokal berbeda dan membutuhkan lebih banyak diskusi. Untuk mengakses papan klip sistem, tetapkan referensi dari papan klip sistem ke Clipboardkelas, seperti:

Clipboard clipboard = getToolkit ().getSystemClipboard ();

Di sisi lain, untuk membuat clipboard lokal Anda hanya perlu membuat Clipboardobjek dengan nama yang ingin Anda tetapkan, misalnya:

Clipboard clipboard = new Clipboard ("My first clipboard");

Mengakses papan klip sistem atau membuat papan klip lokal berbeda tetapi mudah.

Antarmuka ClipboardOwner

Karena Java adalah bahasa multiplatform, dan karena sistem operasi berperilaku berbeda terhadap papan klip, penulis bahasa Java harus menemukan mekanisme untuk mengatasi perbedaan yang tidak kentara. Inilah alasan kehadiran ClipboardOwnerantarmuka. Fungsinya satu-satunya adalah memberi tahu pemilik clipboard ketika datanya sedang ditimpa oleh orang lain. Itu juga dapat memberi sinyal pada aplikasi kapan harus merilis sumber daya yang terkait dengan data.

Dalam aplikasi nyata, lostOwnershipmetode ini dapat digunakan untuk menyetel tanda yang memberi tahu aplikasi Anda tentang ketersediaan data di papan klip. Microsoft Word, meskipun tidak ditulis di Java, adalah contoh bagus dari mekanisme ini yang bekerja di aplikasi. Setiap kali Anda meletakkan sesuatu di clipboard di dalam Word dan kemudian keluar, sebuah kotak dialog muncul memberi tahu Anda bahwa data ada di clipboard. Anda kemudian akan ditanya apakah Anda ingin meninggalkan data di clipboard.

Menerapkan ClipboardOwnerantarmuka relatif mudah karena hanya ada satu metode untuk diterapkan. Metode ini akan menyebabkan program Anda melepaskan kepemilikan papan klip.

Kelas DataFlavor

The DataFlavorkelas digunakan untuk mewakili jenis suatu benda. Anda tidak dibatasi pada satu ragam (atau jenis) data per objek. Dan, seperti kami, objek Anda dapat memiliki banyak kepribadian! Misalnya, kelas gambar dapat direpresentasikan sebagai kelas Java atau sebagai array bit (GIF, JPEG, dan sebagainya). Pada kenyataannya, DataFlavorkelas adalah pembungkus untuk tipe MIME. Standar MIME sangat luas, oleh karena itu hampir tidak ada batasan untuk data yang dapat ditransfer ke clipboard. (Diskusi tentang standar MIME berada di luar cakupan artikel ini, tetapi Anda dapat menemukan informasi tambahan di bagian Sumber Daya.)

Sebagai contoh ragam data, Anda akan menemukan bahwa StringSelectionkelas tersebut memiliki dua ragam berdasarkan tipe MIME. Pada implementasinya adalah "application / x-java-serialized-object", dan yang kedua adalah "text / plain; charset = unicode". Faktanya, implementasi ini memberi tahu kita bahwa kita bisa mengambil teks dari clipboard sebagai Stringkelas ( application/x-java-serialized-object) atau sebagai teks biasa ( text/plain; charset=unicode).

Ada dua cara untuk membuat file DataFlavor. Kamu bisa menulis:

public DataFlavor (representationClass, String humanRepresentationName)

Konstruktor ini akan membuat ragam data baru yang mewakili kelas Java. Yang dikembalikan DataFlavorakan memiliki representationClass = representationClassdan a mimeType = application/x-java-serialized-object. Sebagai contoh, berikut ini akan membuat DataFlavoruntuk java.awt.Button:

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

Sekarang, konstruktor kedua ini

public DataFlavor (String mimeType, String humanRepresentationName)

akan membangun DataFlavormenggunakan a MimeType. Pengembalian DataFlavorakan didasarkan pada MimeType. Jika MimeTypeini application/x-java-serialized-object, maka hasilnya akan sama seperti jika Anda disebut konstruktor sebelumnya. Meskipun demikian, DataFlavorakan dikembalikan representationClass= InputStream and mimeType =mimeType. Sebagai contoh, panggilan berikut akan membuat ragam teks biasa:

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

Tabel berikut menunjukkan metode DataFlavorkelas.

Kelas DataFlavor
Metode Deskripsi
boolean equals (DataFlavor) Uji apakah DataFlavor yang diberikan sama dengan DataFlavor yang diwakili oleh kelas ini
String getHumanPresentableName () Kembalikan nama yang dapat diwakili manusia untuk format yang diwakili oleh DataFlavor ini
void setHumanPresentableName (String) Tetapkan nama representasi manusia untuk DataFlavor ini
String getMimeType () Dapatkan string jenis MIME yang diwakili oleh DataFlavor ini
Class getRepresentationClass () Kembalikan Kelas yang mewakili kelas ini

Antarmuka yang Dapat Dipindahtangankan

The Transferableantarmuka harus dilaksanakan oleh semua kelas yang ingin Anda kirim ke clipboard, maka Clipboardkelas hanya akan memahami kelas yang telah dibungkus oleh Transferableantarmuka. The Transferableantarmuka terdiri dari tiga metode:

Antarmuka yang dapat ditransfer
Metode Deskripsi
DataFlavor getTransferDataFlavor () Kembalikan larik DataFlavor yang mewakili objek
boolean isDataFlavorSupported (DataFlavor) Uji apakah DataFlavor yang disediakan didukung
Object getTransferData (DataFlavor) Kembalikan objek yang diwakili oleh DataFlavor yang disediakan

Ini menyimpulkan tur kami dari semua kelas yang terlibat dalam menangani papan klip. Kita telah melihat bahwa untuk mengakses papan klip kita harus membuat Clipboardobjek atau mendapatkan referensi ke papan klip sistem. Karena papan klip hanya menerima objek berjenis Transferable, objek yang ingin Anda kirim ke papan klip harus menerapkan antarmuka ini. Terakhir, semua objek di papan klip memiliki ragam yang diwakili oleh DataFlavorkelas, yang pada kenyataannya merupakan pembungkus untuk jenis MIME.

Pada bagian selanjutnya, kita akan mempraktikkan apa yang telah kita pelajari.

Resep untuk penggunaan papan klip

Bagaimana berbagai kelas ini mengakses papan klip dapat membingungkan. Untungnya, ada resep sederhana, yang melibatkan langkah-langkah berikut:

Langkah 1. Buat kelas bernama xxxxSelection . Di sini, xxx harus memberi nama jenis yang diwakili oleh rasa ini. Misalnya, ImageSelectionakan menjadi nama yang bagus untuk ragam gambar. Konvensi penamaan ini tentu saja hanyalah sebuah saran. Saya mengikuti konvensi penggunaan yang ditetapkan dengan yang StringSelectiondisediakan di JDK, tetapi Anda dapat memberi nama kelas ini apa pun yang Anda inginkan. Penting untuk diingat bahwa objek ini harus mengimplementasikan antarmuka Transferabledan ClipboardOwner. Jika Anda berencana untuk mentransfer teks, StringSelectionkelas harus digunakan.

Langkah 2. Tentukan kelas untuk mengakses clipboard . Untuk mengakses clipboard lokal, menggunakan panggilan berikut: Clipboard clipboard = new Clipboard ("name"). Untuk mengakses sistem clipboard rekan operasi, menggunakan panggilan ini sebagai gantinya: Clipboard clipboard = getToolkit ().getSystemClipboard ().

Langkah 3. Atur konten clipboard . Untuk melakukannya, gunakan setContentmetode di Clipboardkelas, di mana parameter pertama adalah objek yang mengimplementasikan a Transferable( xxxxSelectionkelas dibuat pada Langkah 1), dan parameter kedua adalah referensi ke kelas yang memanggil metode ini.

Langkah 4. Dapatkan konten clipboard . Gunakan getContentmetode di Clipboardkelas. Metode ini akan mengembalikan kelas tipe Transferable.

Langkah 5. Menerapkan 'operasi pemotongan' . Untuk melakukan ini, Anda harus menghapus data secara manual setelah disalin ke clipboard. Java tidak menyediakan implementasi operasi pemotongan.

Setelah tur singkat kelas yang melibatkan manipulasi papan klip ini, kami akan mengikuti resep yang disarankan untuk menulis applet sederhana yang mentransfer teks ke papan klip sistem.

Daftar 1

Mari kita periksa applet ini:

Daftar 1

Berikut adalah penjelasan dari baris-baris kode tertentu pada Listing 1.

Baris 9: Tentukan kelas applet1untuk memperluas Appletkelas dan mengimplementasikan ClipboardOwnerantarmuka.

Baris 17: Tentukan objek clipboard.

Baris 26: Setel objek clipboard ke clipboard sistem operasi peer.

Baris 45 hingga 47: Menerapkan satu-satunya metode di antarmuka ini. Pada artikel ini kami tidak menggunakan lostOwnershipmetode tersebut tetapi hanya mencetak pesan di konsol. Anda dapat bereksperimen dengan metode ini dengan menyalin beberapa teks ke clipboard menggunakan applet ini, dan kemudian menyalin sesuatu yang lain dari aplikasi lain. Anda akan melihat pesan kehilangan kepemilikan muncul di konsol Java, karena data yang ditempatkan di papan klip (menggunakan applet Java) telah ditimpa oleh aplikasi lain.

Baris 52: Tentukan kelas dari tipe StringSelectionyang mengimplementasikan ragam data teks. Kami kemudian mendapatkan konten bidang teks sumber.

Baris 53: Setel konten clipboard ke fieldContentkelas yang kita tentukan di baris sebelumnya. Perhatikan bahwa kita harus menyediakan pemilik kelas ini, dalam hal ini, applet ini.

Baris 61: Tentukan objek bertipe Transferableuntuk menerima konten clipboard.

Baris 63: Validasi dua hal. Pertama, apakah papan klip kosong? Kedua, apakah konten clipboard memiliki rasa yang tepat? Dalam hal ini kami mencari file stringFlavor.

Baris 67: Dapatkan konten clipboard dalam variabel string. Untuk melakukan ini, kami memanggil getTransferDatametode dengan flavor yang diperlukan. Dalam hal ini, kita membutuhkan DataFlavor.stringFlavortipe.

Baris 69: Setel konten bidang teks tujuan ke konten clipboard.

Anda dapat bereksperimen dengan applet ini dengan mentransfer teks antara applet ini dan applet Java lainnya, atau antara applet Java dan program asli, seperti Notepad, untuk mereka yang menjalankan Microsoft Windows.

Daftar 2

Pada contoh kedua, kita akan menulis applet yang menyalin gambar ke clipboard. Gambar akan menerapkan ragamnya sendiri.

Daftar 2

Berikut adalah penjelasan dari baris-baris kode tertentu pada Listing 2.

Baris 27: Buat objek clipboard yang mereferensikan clipboard lokal.

Baris 41: Setel sourImagekontrol ke Image.gif.

Baris 44 hingga 50: Terapkan lostOwnershipmetode. Kami hanya mencetak pesan di konsol Java.

Baris 6: Buat ImageSelectionobjek berdasarkan gambar di sourceImagekontrol.

Baris 57: Atur konten clipboard dengan ImageSelectionobjek.

Baris 66: Dapatkan konten clipboard.

Baris 68: Pastikan konten tidak null dan ragam yang kita cari didukung.

Baris 71: Dapatkan data dalam rasa yang sesuai.

Baris 72: Setel destinationImagekontrol ke konten yang baru saja diperoleh.

Baris 90: Tentukan ImageSelectionkelasnya.

Baris 93: Mendefinisikan sebuah array yang DataFlavordipanggil supportedFlavorsdengan satu elemen ( imageFlavor).

Baris 102: Buat rasa gambar. Ragam yang dibuat didasarkan pada java.awt.Imagedengan nama representasi "Image."

Baris 111 hingga 130: Menerapkan Transferablemetode.

Baris 123: Kembalikan konten clipboard dengan metode ini.

Baris 125: Validasi rasa. Jika ragam yang diminta didukung, maka objek gambar dikembalikan. Jika tidak, pengecualian akan dilemparkan.

Dalam Listing 1, kami menggunakan default data flavor ( StringSelection) untuk mengirim teks ke papan klip sistem. Di Listing 2, kami melangkah lebih jauh dengan menerapkan ragam data kami sendiri java.awt.Image.