2013-01-24 64 views
1

我一直在搜索互联网以查找示例或如何使用java的拖放操作。我找到了一些,但所有示例只允许您拖动到特定位置,即另一个列表框或文本区域。 我想知道是否有方法将物品拖放到jpanel或类似的容器上,将物品放置在容器上的任何位置。在Java中拖放

+1

请告诉我们你有什么迄今发现 –

+0

https://eyeasme.com/Shayne/JAVA_DND_EXAMPLE/ –

+0

参见[这里](HTTP://计算器。 com/questions/14273923/how-can-i-set-the-priority-mouse-listener/14276466#14276466)示例为Swing组件的DnD,即将一个'JLabel'从一个'JPanel'拖到另一个 –

回答

2

只要目标是您拖动项目的受支持拖放目标,您就可以将其拖放到容器,如JPanel

您可以控制拖放项目在拖放位置的显示方式。如果您的面板覆盖paintComponent(),那么您可以绘制该项目,但您认为合适。

+0

好的,谢谢你的帮助丹。 –

+0

不客气。 –

+1

@DaveFisher如果有帮助请加快答案。 – Amarnath

2

'是拖动项目到一个JPanel办法'

您可以设置与DropTarget您的JPanel。

public class MyDropTarget extends JPanel implements DropTargetListener { 

    private MyImage image; 
    private String text; 

    public MyDropTarget() { 
     setBackground(new Color(30,60,10)); 
     this.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED, new Color(30,60,10).brighter(), new Color(30,60,10).darker())); 
     DropTarget dt = new DropTarget(this, DnDConstants.ACTION_COPY_OR_MOVE, this, true, null); 
     this.setDropTarget(dt); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     if(image != null && image.getImage() != null) { 
      g.drawImage(image.getImage(), 0, 0, null); 
      if(image.isError()){ 
       g.setColor(Color.BLACK); 
       g.drawString(text, 0, 0); 
      } 
     } 
    } 

    public void dragEnter(DropTargetDragEvent dtde) { 
     this.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED, Color.RED.brighter(), Color.RED.darker())); 
    } 

    public void dragExit(DropTargetEvent dte) { 
     this.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED, UIManager.getColor("MenuBar.highlight"), UIManager.getColor("MenuBar.shadow"))); 
    } 

    public void dragOver(DropTargetDragEvent dtde) { 
    } 

    public void drop(DropTargetDropEvent dtde) { 
     try {   
      text = (String) dtde.getTransferable().getTransferData(DataFlavor.stringFlavor); 
      image = (MyImage)dtde.getTransferable().getTransferData(DataFlavor.imageFlavor); 
      this.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED, new Color(30,60,10).brighter(), new Color(30,60,10).darker())); 
      dtde.dropComplete(true); 
      repaint(); 
     } catch(UnsupportedFlavorException e) { 
      e.printStackTrace(); 
     } catch(IOException e) { 
      e.printStackTrace(); 
     } 
     this.setDropTarget(null); 
    } 

    public void dropActionChanged(DropTargetDragEvent dtde) { 
    } 
} 
+0

'MyImage'只是java.awt.Image的简单包装 – oliholz

1

我实现了将这样&降:

用于将&下降已经出现在Java 6中的执行相当方便的机制,但它确实有它的缺点。例如,您应该明确指定放置目标,当您需要在放下目标附近放置对象时,该目标不是非常有用。在标准实现中,也不保证侦听器方法的执行顺序。我会告诉你实现一个更可扩展的Drag的概念。

最初应该将鼠标侦听器(Mouse Listener和MouseMotionListener)分配给所有的Drag Sources。需要实现3种方法:鼠标点击对象的方法,在对象上按住鼠标按钮的同时移动鼠标的方法(MouseMotionListener中的mouseDragged)和鼠标移动方法。

听众分配如下所示:

component.addMouseListener(new MouseAdapter() { 
    @Override 
    public void mousePressed(MouseEvent e) { 
     //block click right mouse button 
     if (MouseEvent.BUTTON1 == e.getButton()) { 
      startDrag(e); 
     } 
    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
     //block click right mouse button 
     if (MouseEvent.BUTTON1 == e.getButton()) { 
      endDrag(e); 
     } 
    } 
}); 

component.addMouseMotionListener(new MouseMotionAdapter() { 
    @Override 
    public void mouseDragged(MouseEvent e) { 
     drag(e); 
    } 
}); 

因此,当你点击对象拖到&降开始,当你移动鼠标的对象应该移动,当你松开鼠标的对象应该改变它的位置并被移到一个新的容器中。如果对象将在一个容器的所述框架上移动,则可以只实现的mouseDragged()方法,其中,所述拖动对象的坐标将被改变:

@Override 
public void mouseDragged(MouseEvent e) { 
    Point mouseLocation = e.getLocationOnScreen(); 
    Component draggedComponent = (Component) e.getSource(); 
    SwingUtilities.convertPointFromScreen(mouseLocation, 
draggedComponent.getParent()); 
    draggedComponent.setLocation(mouseLocation); 
} 

但是拖动的对象坐标可以是相对于它所在的容器进行设置。因此,当鼠标移动到另一个容器时,需要将组件添加到新的容器并计算新的坐标等。此方法不是非常漂亮和可扩展的,所以我建议使用GlassPane来显示拖动的对象。

的算法如下所示:

  • 点击对象。

  • 获取对象的屏幕截图(请参阅how to make a screenshot)。 隐藏原始对象。

  • 在glassPane上绘制对象的屏幕截图,基于鼠标的 坐标。

  • 当您移动鼠标时,您需要根据 重新绘制屏幕截图到新坐标。

  • 当您释放鼠标时,您需要将对象放置在光标所在的位置的 容器中。

  • 显示原始对象。

使用这种方法,我们没有任何依赖放置光标的容器来放置Drop,相应的,对象可以在任何地方“Dropped”。

玻璃面板与透明效果:

public class GhostGlassPane extends JPanel { 
    private final AlphaComposite composite; 
    private BufferedImage ghostImage = null; 
    private Point location = new Point(0, 0); 

    public GhostGlassPane() { 
     setOpaque(false); 
     composite = AlphaComposite.getInstance(AlphaComposite. 
SRC_OVER, 0.7f); 
} 
public void paintComponent(Graphics g) { 

    if (ghostImage == null) 
     return; 

    Graphics2D g2 = (Graphics2D) g; 
    g2.setComposite(composite); 
    g2.drawImage(ghostImage, (int) (location.getX()), 
(int) (location.getY()), null); 

    } 
} 

在此仅响应执行的概念给出。

此信息是从我的文章取:Frequently Asked Questions during Java applet development