2011-12-19 81 views
3

我正在處理可以將一個JLabel的內容放入另一個JLabel的應用程序。我使用這個類NameSlot:拖放JLabel:如何獲取拖動源

public class NameSlot extends JLabel implements DropTargetListener{ 

NameSlot(String name){ 
    super(name); 
    new DropTarget(this,this); 

    this.setTransferHandler(new TransferHandler("foreground")); 
    MouseListener listener = new MouseAdapter() { 
     public void mousePressed(MouseEvent me) { 
     JLabel comp = (JLabel) me.getSource(); 
     TransferHandler handler = comp.getTransferHandler(); 
     handler.exportAsDrag(comp, me, TransferHandler.COPY); 
     } 
    }; 
    this.addMouseListener(listener); 
} 



@Override 
public void dragEnter(DropTargetDragEvent dtde) { 
    // TODO Auto-generated method stub 

} 


@Override 
public void dragExit(DropTargetEvent dte) { 
    // TODO Auto-generated method stub 

} 


@Override 
public void dragOver(DropTargetDragEvent dtde) { 
    // TODO Auto-generated method stub 

} 


@Override 
public void drop(DropTargetDropEvent dtde) { 

//  DropTarget dt = (DropTarget) dtde.getSource(); 
//  NameSlot ns = (NameSlot) dt.getComponent(); 

    try { 
     JLabel l =(JLabel) dtde.getTransferable().getTransferData(DataFlavor.stringFlavor); 
     System.out.println("drop detected from "+l.getText()+" to "+this.getText()); 
    } catch (UnsupportedFlavorException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 


@Override 
public void dropActionChanged(DropTargetDragEvent dtde) { 
    // TODO Auto-generated method stub 

} 

這就是我initiale它:

this.setLayout(null); 
    NameSlot ns = new NameSlot("test"); 
    ns.setLocation(20, 20); 
    this.add(ns); 

    NameSlot ns2 = new NameSlot("test2"); 
    ns2.setLocation(20, 20); 
    this.add(ns2); 

嘗試使用dtde.getSource()之後,並取消它,因爲coolcfans評論,我現在試圖讓拖動源使用DropTargetEvent的Transferable。我得到的例外:

java.awt.datatransfer.UnsupportedFlavorException: Unicode String 
    at javax.swing.TransferHandler$PropertyTransferable.getTransferData(Unknown Source) 
    at sun.awt.dnd.SunDropTargetContextPeer.getTransferData(Unknown Source) 
    at sun.awt.datatransfer.TransferableProxy.getTransferData(Unknown Source) 
    at java.awt.dnd.DropTargetContext$TransferableProxy.getTransferData(Unknown Source) 
    at an.judosoft.view.bracketSheets.factory.NameSlot.drop(NameSlot.java:71) 

任何人都知道的方式?

+0

在這裏,您使用的拖放目標,無論拖放操作從拖動源開始,這可能是一個問題嗎? – coolcfan 2011-12-19 09:54:13

+0

我不明白你的意思。我該怎麼做呢? – Anthea 2011-12-19 12:42:04

+0

沒有必要使用'setPosition()'方法。所有組件都已經支持'setLocation()'方法來執行此操作。 – camickr 2011-12-19 16:07:39

回答

2

以下工作:

我改變this.setTransferHandler(new TransferHandler("foreground"))this.setTransferHandler(new TransferHandler("text"))

和使用new DataFlavor("application/x-java-jvm-local-objectref; class=java.lang.String")爲DataFlavor的,雖然它返回一個String,而不是一個JLabel的。如果你想要一個JLabel,你需要改變TransferHandler。

import java.awt.FlowLayout; 
import java.awt.datatransfer.DataFlavor; 
import java.awt.datatransfer.UnsupportedFlavorException; 
import java.awt.dnd.DropTarget; 
import java.awt.dnd.DropTargetDragEvent; 
import java.awt.dnd.DropTargetDropEvent; 
import java.awt.dnd.DropTargetEvent; 
import java.awt.dnd.DropTargetListener; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.io.IOException; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.TransferHandler; 

public class NameSlot extends JLabel implements DropTargetListener { 
    NameSlot(final String name) { 
     super(name); 
     new DropTarget(this, this); 
     this.setTransferHandler(new TransferHandler("text")); 
     final MouseListener listener = new MouseAdapter() { 
      @Override 
      public void mousePressed(final MouseEvent me) { 
       final JLabel comp = (JLabel) me.getSource(); 
       System.out.println(comp); 

       final TransferHandler handler = comp.getTransferHandler(); 
       handler.exportAsDrag(comp, me, TransferHandler.COPY); 
      } 
     }; 
     this.addMouseListener(listener); 
    } 

    @Override 
    public void dragEnter(final DropTargetDragEvent dtde) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void dragExit(final DropTargetEvent dte) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void dragOver(final DropTargetDragEvent dtde) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void drop(final DropTargetDropEvent dtde) { 

     // DropTarget dt = (DropTarget) dtde.getSource(); 
     // NameSlot ns = (NameSlot) dt.getComponent(); 

     try { 
      final String s = (String) dtde.getTransferable().getTransferData(
        new DataFlavor("application/x-java-jvm-local-objectref; class=java.lang.String")); 

      System.out.println("drop detected from " + s + " to " + this.getText()); 
     } 
     catch (final UnsupportedFlavorException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     catch (final IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     catch (final ClassNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

    @Override 
    public void dropActionChanged(final DropTargetDragEvent dtde) { 
     // TODO Auto-generated method stub 

    } 

    public static void main(final String[] args) { 
     final JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.setLayout(new FlowLayout()); 

     final NameSlot ns = new NameSlot("test"); 
     frame.add(ns); 

     final NameSlot ns2 = new NameSlot("test2"); 
     frame.add(ns2); 

     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 

    } 
} 
+0

感謝您的幫助,這很好。是否可以在發送傳送處理程序處應用任何其他文本信息,然後顯示? – Anthea 2012-01-10 00:51:00

+0

是的,但你需要做的是擴展TransferHandler併爲'createTransferable'提供你自己的實現。然後,無論您返回的對象是實際獲得複製的可轉讓對象。我會看看TransferHandler的源代碼,以瞭解它是如何工作的。 – 2012-01-10 02:31:54