Contoh dalam artikel ini menjelaskan bagaimana Java menggunakan drag and drop mouse untuk bertukar data program, yang disebut fungsi drag and drop mouse. Fungsi drag-and-drop pada mouse sangat umum digunakan dalam sistem grafis. Java menyediakan paket java.awt.dnd dan java.awt.datatransfer untuk mendukung fungsi ini. Contoh ini mendemonstrasikan cara menerapkan drag and drop dalam program. Saat Anda mengklik mouse pada label "Hello World!" di bagian atas jendela dan menyeretnya ke kotak teks di bagian bawah jendela, "Halo Dunia!" akan ditambahkan ke kotak teks. !" teks; lanjutkan dengan proses di atas dan teks akan terus ditambahkan.
Ide implementasi spesifik dan metode fungsi program adalah sebagai berikut: Dalam implementasi drag and drop mouse, dua konsep terpenting adalah drag source dan drop target, yaitu drag source dan drop target. Sumber seret dan target lepas keduanya terkait dengan komponen yang terlihat (bagaimana cara menyeret jika tidak terlihat?!). Inti dari teknologi drag-and-drop adalah mentransfer data pada komponen sumber drag-and-drop ke komponen target penempatan. Oleh karena itu, dari perspektif tingkat rendah, drag-and-drop sangat mirip dengan teknologi clipboard dalam contoh di atas.
Implementasi sumber tarik: Kelas sumber tarik harus terlebih dahulu membuat instance DragGestureRecognizer, yang menunjukkan bahwa kelas tersebut adalah kelas komponen sumber tarik atau berisi komponen sumber tarik. Hal ini dapat dicapai dengan memanggil metode createDefaultDragGestureRecognizer() dari objek DataSource. Implementasi spesifiknya adalah sebagai berikut:
int action = DnDConstants.ACTION_COPY_OR_MOVE; //Seret dan lepas ketik ds.createDefaultDragGestureRecognizer(ini,aksi,ini);
Pernyataan di atas menunjukkan bahwa komponen sumber drag adalah objek instance dari kelas itu sendiri, tipe drag and drop yang harus diselesaikan adalah tipe DnDConstants.ACTION_COPY_OR_MOVE, dan kelas yang mengimplementasikan antarmuka DragGestureListener adalah kelas ini. Sumber drag umumnya mengimplementasikan antarmuka DragGestureListener, yang mendefinisikan metode dragGestureRecognized(). Saat dragGestureListener dimulai, DragGestureListener mendengarkan kejadian tersebut, dan kemudian mentransfer ke metode dragGestureRecognized() untuk memproses kejadian tersebut, seperti mengirim data drag. sumber. Kode khusus:
public void dragGestureRecognized(DragGestureEvent dge) {//throw new java.lang.UnsupportedOperationException("Metode dragGestureRecognized() belum diterapkan."); try{Transferable tr = new StringSelection(this.getText()); //Transfer label Teks sebagai data, dengan Dapat Dipindahtangankan Pengemasan objek //Mulai menyeret, atur kursor ke bentuk DragSource.DefaultCopyNoDrop, data seret dan lepas adalah objek tr, dan DragSourceListener adalah kelas ini dge.startDrag(DragSource.DefaultCopyNoDrop,tr,this);}catch(Exception err) {err.printStackTrace();}}
Sumber drag juga harus mengimplementasikan antarmuka DragSourceListener, yang mendefinisikan metode penanganan kejadian untuk setiap keadaan yang terkait dengan drag dan drop. Seperti dragEnter, dragOver, dropActionChanged, dragExit dan metode lainnya. Dalam contoh ini, metode dragEnter() akan diterapkan untuk mengatur bentuk kursor selama menyeret, dan metode lainnya akan menjadi metode kosong. Kode implementasi spesifiknya adalah sebagai berikut:
public void dragEnter(DragSourceDragEvent dsde) {//throw new java.lang.UnsupportedOperationException("Metode dragEnter() belum diterapkan.");DragSourceContext dsc = dsde.getDragSourceContext(); //Dapatkan referensi konteks dari sumber drag/ / Atur bentuk kursor saat menyeret int action = dsde.getDropAction();if ((action&DnDConstants.ACTION_COPY)!=0)dsc.setCursor(DragSource.DefaultCopyDrop);elsedsc.setCursor(DragSource.DefaultCopyNoDrop);}
Implementasi target drop: Sebuah instance DragTarget harus dibuat terlebih dahulu di kelas target drop untuk menunjukkan bahwa kelas ini adalah kelas komponen target drop atau berisi komponen target drop.
DropTarget baru(ini.jTextField1,DnDConstants.ACTION_COPY_OR_MOVE,ini);
Pernyataan di atas menunjukkan bahwa target drop adalah objek this.jTextField1, operasi drag-and-drop bertipe DnDConstants.ACTION_COPY_OR_MOVE, dan kelas yang mengimplementasikan antarmuka DropTargetListener adalah kelas ini. Sesuai dengan DrafSourceListener, target drop atau kelasnya umumnya mengimplementasikan antarmuka DropTargetListener. Antarmuka ini juga mendefinisikan banyak metode, seperti dragEnter, dragOver, dll., untuk menangani kejadian ketika proses drag-and-drop memasuki tahapan yang berbeda. Contoh ini hanya memperhatikan metode drop(), yang merupakan pemrosesan peristiwa ketika mouse dilepaskan pada komponen target penempatan. Biasanya digunakan untuk memproses data yang dikirimkan ditampilkan pada komponen JTextField. Lainnya Metode ini adalah metode kosong, kode spesifiknya adalah sebagai berikut:
public void drop(DropTargetDropEvent dtde) {//throw new java.lang.UnsupportedOperationException("Metode drop() belum diterapkan.");try{Transferable tr = dtde.getTransferable(); //Dapatkan objek data yang diteruskan/ / Memproses objek data dan mendapatkan informasi teks jika (dtde.isDataFlavorSupported(DataFlavor.stringFlavor)){dtde.acceptDrop(dtde.getDropAction());String s = (String) tr.getTransferData(DataFlavor.stringFlavor);this.jTextField1.setText(this.jTextField1.getText() +s); //Menampilkan informasi teks yang diteruskan dari sumber drag pada target drop dtde.dropComplete(true);}else{dtde.rejectDrop();}}catch(Exception err){err.printStackTrace();}}
Kode program:
1. Buat Proyek baru dan beri nama JDragAndDropDemo.
2. Buat Aplikasi baru dan beri nama JDragAndDropDemo; beri nama jendela utama MainFrame dan beri judul JDragAndDropDemo.
3. Buat Kelas baru, beri nama DragJLabel, dan warisi kelas JLabel.
4. Gunakan antarmuka wizards|implements untuk membuat kelas DragJLabel mengimplementasikan antarmuka DragGestureListener dan DragSourceListener.
5. Tambahkan atribut baru DragSource ds pada class DragJLabel, kodenya seperti berikut:
class DragJLabel extends JLabel mengimplementasikan DragGestureListener, DragSourceListener {DragSource ds = DragSource.getDefaultDragSource(); //Buat instance DragSource...}
6. Tulis metode konstruktor kelas DragJLabel.
public DragJLabel(String title,intalignment){super(title,alignment); //Gunakan metode kelas induk int action = DnDConstants.ACTION_COPY_OR_MOVE;ds.createDefaultDragGestureRecognizer(this,action,this);
7. Terapkan metode dragGestureRecognized() di kelas DragJLabel, bungkus dan kirim data.
public void dragGestureRecognized(DragGestureEvent dge) {//throw new java.lang.UnsupportedOperationException("Metode dragGestureRecognized() belum diterapkan.");try{Transferable tr = new StringSelection(this.getText());dge.startDrag(DragSource .DefaultCopyNoDrop,tr,ini);}catch(Exception salah){err.printStackTrace();}}
8. Implementasikan metode dragEnter() di kelas DragJLabel untuk mengatur bentuk kursor.
public void dragEnter(DragSourceDragEvent dsde) {//throw new java.lang.UnsupportedOperationException("Metode dragEnter() belum diterapkan.");DragSourceContext dsc = dsde.getDragSourceContext();int action = dsde.getDropAction();if ((action&DnDConstants.ACTION_COPY)!=0)dsc.setCursor(DragSource.DefaultCopyDrop);elsedsc.setCursor(DragSource.DefaultCopyNoDrop);}
9. Tambahkan komponen JTextField di bagian bawah jendela desain kelas MainFrame, dan buat instance DragJLabel di kelas tersebut. Kode spesifiknya adalah sebagai berikut:
MainFrame kelas publik memperluas implementasi JFrame DropTargetListener {private JPanel contentPane;private BorderLayout borderLayout1 = new BorderLayout();private JTextField jTextField1 = new JTextField();DragJLabel label = new DragJLabel("Hello World!",SwingConstants.CENTER);……}
10. Tulis metode inisialisasi jbInit() kelas MainFrame, atur properti awal komponen, dan buat instance DropTarget baru. Kodenya adalah sebagai berikut:
private void jbInit() menampilkan Pengecualian {//setIconImage(Toolkit.getDefaultToolkit().createImage(MainFrame.class.getResource("[Ikon Anda]")));contentPane = (JPanel) this.getContentPane();contentPane.setLayout (borderLayout1);ini.setSize(Dimensi baru(410, 114));this.setTitle("JDragAndDropDemo");jTextField1.setFont(java.awt.Font baru("Dialog", 0, 14));contentPane.add(jTextField1, BorderLayout.SOUTH);contentPane.add(ini .label,BorderLayout.NORTH);baru DropTarget(ini.jTextField1,DnDConstants.ACTION_COPY_OR_MOVE,ini);}
11. Gunakan antarmuka wizards|implements untuk membuat kelas MainFrame mengimplementasikan antarmuka DropTargetListener.
12. Terapkan metode drop() yang diwarisi dari antarmuka DropTargetListener untuk memproses data yang dikirimkan. Kode spesifiknya adalah sebagai berikut:
public void drop(DropTargetDropEvent dtde) {//throw new java.lang.UnsupportedOperationException("Metode drop() belum diterapkan.");try{Transferable tr = dtde.getTransferable();if (dtde.isDataFlavorSupported(DataFlavor.stringFlavor)){dtde.acceptDrop(dtde.getDropAction());String s = (String) tr.getTransferData(DataFlavor.stringFlavor);this.jTextField1.setText(this.jTextField1.getText()+s);dtde.dropComplete(true);}else{dtde.rejectDrop();}}catch(Exception err){ err.printStackTrace();}}