2012-05-08 93 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); 
    } 
}