程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java完成鼠標拖放功效的辦法

Java完成鼠標拖放功效的辦法

編輯:關於JAVA

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();
}
}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved