Java完成鼠標拖放功效的辦法。本站提示廣大學習愛好者:(Java完成鼠標拖放功效的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是Java完成鼠標拖放功效的辦法正文
本文實例講述了Java應用鼠標的拖放來完成交流法式數據的辦法,即所謂的鼠標拖放功效。鼠標的拖放功效在圖形化體系中異常經常使用,Java 供給了java.awt.dnd 和java.awt.datatransfer 包來支撐該功效。本例演示若何在法式中完成拖放的完成辦法,當在窗口上部的“Hello World!”標簽點下鼠標,並拖至窗口下部的文本框攤開,則在文本框中將添加“Hello World !”文本;持續上述進程,將持續添加該文本。
該法式功效詳細的完成思緒和辦法為:在鼠標拖放的完成中,兩個最主要的概念是拖拽源和放置目的,即drag source 和drop target。拖拽源和放置目的都是與可視化的組件相干聯的(假如弗成視,還怎樣拖呢?!)。拖放技巧的本質就是將拖拽源組件上的數據傳遞到放置目的組件上,是以從底層看,拖放和上例中的剪貼板技巧很接近。
拖拽源的完成:拖拽源類必需先創立一個DragGestureRecognizer 實例,注解該類是拖拽源組件類或包括拖拽源組件。可以經由過程挪用DataSource 對象的createDefaultDragGestureRecognizer()辦法完成。詳細的完成以下:
int action = DnDConstants.ACTION_COPY_OR_MOVE; //拖放的類型 ds.createDefaultDragGestureRecognizer(this,action,this);
下面的語句注解, 拖拽源組件是本類本身的實例對象, 要完成的拖放的品種是DnDConstants.ACTION_COPY_OR_MOVE 型的,完成DragGestureListener 接口的類是本類。拖拽源普通完成DragGestureListener 接口,該接口中界說了一個dragGestureRecognized()辦法,當開端拖拽是,DragGestureListener 監聽到事宜,隨即轉入dragGestureRecognized()辦法處置事宜,如將拖拽源的數據發送出去。詳細代碼:
public void dragGestureRecognized(DragGestureEvent dge) { //throw new java.lang.UnsupportedOperationException("Method dragGestureRecognized() not yet implemented."); try{ Transferable tr = new StringSelection(this.getText()); //將標簽的文本作為數據,由Transferable 對象包裝 //開端拖拽,設置光標為DragSource.DefaultCopyNoDrop 形,拖放的數據是tr 對象,DragSourceListener 是本類 dge.startDrag(DragSource.DefaultCopyNoDrop,tr,this); }catch(Exception err){ err.printStackTrace(); } }
拖拽源還得完成DragSourceListener 接口,該接口界說了拖拽相干的各狀況的事宜處置辦法。如dragEnter、dragOver、dropActionChanged、dragExit等辦法。本例中,將完成dragEnter()辦法來設置拖拽時的光標外形,其他的辦法為空辦法。詳細完成代碼以下:
public void dragEnter(DragSourceDragEvent dsde) { //throw new java.lang.UnsupportedOperationException("Method dragEnter() not yet implemented."); DragSourceContext dsc = dsde.getDragSourceContext(); //獲得拖拽源的高低文援用 //設置拖拽時的光標外形 int action = dsde.getDropAction(); if ((action&DnDConstants.ACTION_COPY)!=0) dsc.setCursor(DragSource.DefaultCopyDrop); else dsc.setCursor(DragSource.DefaultCopyNoDrop); }
放置目的的完成:放置目的的類中必需先創立一個DragTarget 實例,來注解本類是放置目的組件類或包括放置目的組件,完成以下:
new DropTarget(this.jTextField1,DnDConstants.ACTION_COPY_OR_MOVE,this);
下面的語句注解, 放置目的是this.jTextField1 對象, 拖放操作是DnDConstants.ACTION_COPY_OR_MOVE 型的,而完成DropTargetListener 接口的類是本類。與DrafSourceListener 絕對應,放置目的或其地點類普通完成DropTargetListener 接口。該接口也界說了許多的辦法,如dragEnter、dragOver 等,用於處置當拖放進程進入分歧階段時的事宜。本例只關懷drop()辦法,即當在放置目的組件上攤開鼠標時的事宜處置,普通用來處置傳遞到的數據,如本例中將在JTextField 組件上顯示傳遞來的文本數據,其他辦法為空辦法,詳細代碼以下:
public void drop(DropTargetDropEvent dtde) { //throw new java.lang.UnsupportedOperationException("Method drop() not yet implemented."); 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(); } }
法式代碼:
1.新建一個Project,取名為JDragAndDropDemo。
2.新建一個Application,取名為JDragAndDropDemo;主窗口取名為MainFrame,題目為JDragAndDropDemo。
3.新建一個Class,取名為DragJLabel,繼續JLabel 類。
4.應用wizards|implements interface 使DragJLabel 類完成DragGestureListener 、DragSourceListener 接口。
5.在類DragJLabel 中添加新的屬性 DragSource ds,代碼以下:
class DragJLabel extends JLabel implements DragGestureListener, DragSourceListener { DragSource ds = DragSource.getDefaultDragSource(); //創立DragSource 實例 …… }
6.編寫DragJLabel 類的結構辦法。
public DragJLabel(String title,int alignment){ super(title,alignment); //應用父類的辦法 int action = DnDConstants.ACTION_COPY_OR_MOVE; ds.createDefaultDragGestureRecognizer(this,action,this); //創立 }
7.完成DragJLabel 類中的dragGestureRecognized()辦法,包裝並發送數據。
public void dragGestureRecognized(DragGestureEvent dge) { //throw new java.lang.UnsupportedOperationException("Method dragGestureRecognized() not yet implemented."); try{ Transferable tr = new StringSelection(this.getText()); dge.startDrag(DragSource.DefaultCopyNoDrop,tr,this); }catch(Exception err){ err.printStackTrace(); } }
8.完成DragJLabel 類中的dragEnter()辦法,設置光標的外形。
public void dragEnter(DragSourceDragEvent dsde) { //throw new java.lang.UnsupportedOperationException("Method dragEnter() not yet implemented."); DragSourceContext dsc = dsde.getDragSourceContext(); int action = dsde.getDropAction(); if ((action&DnDConstants.ACTION_COPY)!=0) dsc.setCursor(DragSource.DefaultCopyDrop); else dsc.setCursor(DragSource.DefaultCopyNoDrop); }
9.在MainFrame 類的設計窗口中下部添加一個JTextField 組件,並在類中創立一個DragJLabel實例,詳細代碼以下:
public class MainFrame extends JFrame implements DropTargetListener { private JPanel contentPane; private BorderLayout borderLayout1 = new BorderLayout(); private JTextField jTextField1 = new JTextField(); DragJLabel label = new DragJLabel("Hello World !",SwingConstants.CENTER); …… }
10.編寫MainFrame 類的初始化辦法jbInit(),設置組件的初始屬性,並創立一個新的DropTarget實例,代碼以下:
private void jbInit() throws Exception { //setIconImage(Toolkit.getDefaultToolkit().createImage(MainFrame.class.getResource("[Your Icon]"))); contentPane = (JPanel) this.getContentPane(); contentPane.setLayout(borderLayout1); this.setSize(new Dimension(410, 114)); this.setTitle("JDragAndDropDemo"); jTextField1.setFont(new java.awt.Font("Dialog", 0, 14)); contentPane.add(jTextField1, BorderLayout.SOUTH); contentPane.add(this.label,BorderLayout.NORTH); new DropTarget(this.jTextField1,DnDConstants.ACTION_COPY_OR_MOVE,this); }
11.應用wizards|implements interface 使MainFrame 類完成DropTargetListener 接口。
12.完成繼續自DropTargetListener 接口的辦法drop(),處置傳遞來的數據,詳細代碼以下:
public void drop(DropTargetDropEvent dtde) { //throw new java.lang.UnsupportedOperationException("Method drop() not yet implemented."); 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(); } }