2012-05-08 90 views
4

我是新來的在Swing中拖放。我有一個JPanel,它繪製了一個帶有標題的圖像。我想實現拖放在這個JPanel,但經過一些文檔和教程後,我沒有找到任何可用的指針,說明如何完成這種類型的組件。對於初學者來說,它沒有setDragEnabled功能。實現從一個JPanel到另一個JPanel的拖放

我可以製作一個JPanel可拖動嗎?我想使用這種DnD操作將對某個對象的引用從一個面板傳遞到另一個面板。

+2

*「我可以使JPanel拖動嗎?」*它的可拖動的,如果添加到'JList'。 –

+4

http://www.bryanesmith.com/documents/drag-and-drop-panel-demo/index.html? – StanislavL

+0

尼斯鏈接@StanislavL – Robin

回答

3

您可以在任何JComponent上實現拖放行爲。請參閱setTransferHandler方法。

setDragEnabled方法通常提供給可以在JDK中實現良好默認行爲的組件。在這種情況下,您可以通過調用該方法來激活默認D & D.

JPanel他們(= Swing開發者)可能可能不會想到任何像樣的默認D行爲,所以您將不得不實施自己的TransferHandler。我強烈建議在開始之前閱讀Drag-and-drop tutorial

+0

我遇到了一些問題。以下是一些相關的代碼片段:http:// pastebin。com/2UdnxSBH我看到* [DRAG]已創建Transferable [email protected]*後跟* [DROP]檢測到的丟棄[email protected]*。 'Transferable'不是'DataHandler'的一個實例,這正是我所期望的。 – Pieter

+0

也許我應該澄清一下,我試圖將一個'JPanel'拖到另一個'JPanel'。 [Top-Level Drop](http://docs.oracle.com/javase/tutorial/uiswing/dnd/toplevel.html)教程僅涵蓋將文件拖放到應用程序上。 – Pieter

1

我不知道怎麼的聲音可行的,但,當我需要拖放板我這樣做的:

Firstable我實現動作事件dragable板和容器,它可以是既

我用一個靜態變量選擇父母,選擇兒童和當前面板

當鼠標在面板設置爲當前面板

當您單擊,按下鼠標,無論你是否currentpanel被點擊的一個,並設置是爲孩子面板

當鼠標在面板及子面板不爲空,那麼看來你」重新拖拽,一旦釋放鼠標,當前面板將變爲父面板

您必須添加一些驗證。

如果面板被拖動你可以用你自己的實現,也可能是跟隨鼠標COORDS或只是強調它和突出的父母,我用這最後的選項,以模擬阻力


OK我寫了這個,很奇怪,但這是這個想法:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.awt.Rectangle; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.BorderFactory; 
import javax.swing.JButton; 
import javax.swing.JDesktopPane; 
import javax.swing.JFrame; 
import javax.swing.JTextField; 

/** 
* 
* @author porfiriopartida 
*/ 
public class DraggablePanel extends JDesktopPane implements ContainerPanel{ 
    public ContainerPanel parent; 

    static DraggablePanel over; 
    static ContainerPanel overParent; 
    static DraggablePanel dragging; 
    static ContainerPanel draggingParent; 

    public DraggablePanel(){ 
     this(null); 
    } 
    public DraggablePanel(ContainerPanel parent){ 
     this.parent = parent; 
     setBorder(BorderFactory.createLineBorder(Color.black)); 
     setBounds(0,0,100,100); 

     if(parent != null) 
      addMouseListener(new MouseAdapter(){ 
      @Override 
      public void mouseEntered(MouseEvent me) { 
       DraggablePanel src = (DraggablePanel) me.getSource(); 
       DraggablePanel.over = src; 
       DraggablePanel.overParent = DraggablePanel.over.parent; 
      } 

      @Override 
      public void mouseExited(MouseEvent me) { 

      } 

      @Override 
      public void mouseReleased(MouseEvent me) { 
       if(DraggablePanel.over != null && DraggablePanel.dragging != null && DraggablePanel.overParent != null){ 
        Rectangle bounds = DraggablePanel.dragging.getBounds(); 
        bounds.x = me.getX(); 
        bounds.y = me.getY(); 

        //Remove child from parent 
        DraggablePanel.dragging.parent.removePanel(DraggablePanel.dragging); 

        if(DraggablePanel.dragging.parent != DraggablePanel.overParent){ 
         //add child to new parent 
         DraggablePanel.overParent.addPanel(DraggablePanel.dragging, bounds); 
        } 
        else{ 
         //same parent selected 
         DraggablePanel.dragging.parent.addPanel(DraggablePanel.dragging, bounds); 
        }; 
        DraggablePanel.dragging.parent = DraggablePanel.overParent; 
       } 

       //cleaning variables 
       DraggablePanel.dragging = null; 
       DraggablePanel.over = null; 
       DraggablePanel.draggingParent = null; 
       DraggablePanel.overParent = null; 

      } 

      @Override 
      public void mousePressed(MouseEvent me) { 
       DraggablePanel.dragging = (DraggablePanel) me.getSource(); 
       DraggablePanel.draggingParent = DraggablePanel.dragging.parent; 
      } 
     }); 

     addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseEntered(MouseEvent me) { 
       super.mouseEntered(me); 
       ContainerPanel src = (ContainerPanel) me.getSource(); 
       DraggablePanel.overParent = src; 
       if (DraggablePanel.draggingParent == null || DraggablePanel.draggingParent == src) { 
        setBorder(BorderFactory.createLineBorder(Color.BLACK, 2)); 
       } else { 
        setBorder(BorderFactory.createLineBorder(Color.blue, 2)); 
       } 
      } 

      @Override 
      public void mouseExited(MouseEvent me) { 

      } 

      @Override 
      public void mouseReleased(MouseEvent me) { 
      } 
     }); 
    } 

    @Override 
    public void addPanel(DraggablePanel panel) { 
     panel.parent = this; 
     add(panel); 

      repaint(); 
      revalidate(); 

      try { 
      getParent().repaint(); 
     } catch (Exception e) { 
     } 

    } 
    @Override 
    public void addPanel(DraggablePanel panel, Rectangle bounds) { 
     setBounds(bounds); 
     addPanel(panel); 
    } 

    @Override 
    public void removePanel(DraggablePanel panel) { 
     remove(panel); 
    } 



    public static void main(String args[]){ 
     JFrame frame = new JFrame(); 
     frame.setLayout(new GridLayout(1,1)); 
     JTextField tf = new JTextField("textfield"); 
     JButton btn = new JButton("Button"); 

     DraggablePanel desktop = new DraggablePanel(); 
     frame.add(desktop); 

     DraggablePanel p1 = new DraggablePanel(desktop); 
     p1.setLayout(new GridLayout(2,1)); 
     p1.add(tf); 
     p1.setBounds(0,0,100,50); 
     tf.setBounds(5,5,80,30); 

     DraggablePanel p2 = new DraggablePanel(desktop); 
     p2.setLayout(new GridLayout(2,1)); 
     p2.add(btn); 
     p2.setBounds(50,50,50,30); 
     btn.setBounds(5,5,30,20); 

     desktop.add(p1); 
     desktop.add(p2); 

     frame.setPreferredSize(new Dimension(600,400)); 
     frame.pack(); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
}