如何将图像从标签拖放到标签?

时间:2016-04-06 08:21:18

标签: java image swing drag-and-drop jlabel

我是在java中使用DnD的新手。我试图将图像从标签拖放到另一个标签。第一个标签是源,第二个是目的地。我的麻烦在于我需要从源中拖动图像并认识到我正在下降到正确的目的地;如果目的地是正确的,来自源的图像必须消失,否则必须返回源并使用窗口消息或仅System.out.println()将其通知给用户。我已尝试使用TransferHandlerDragSource,但我没有获得单一的好结果。

如何将图像从标签拖放到标签?

拖动侦听器

public class DragMouseAdapter extends MouseAdapter {
        public void mousePressed(MouseEvent e) {
            JComponent c = (JComponent) e.getSource();
            TransferHandler handler = c.getTransferHandler();
            handler.exportAsDrag(c, e, TransferHandler.COPY);


        }
    }

包含图片的来源标签

public ShipsGUI() {
    // setBorder(new EmptyBorder(10,10,10,10));
    setLayout(new GridLayout(2, 5));
    MouseListener listener = new DragMouseAdapter();
    for (int i = 0; i < 10; i++) {
        JPanel p = new JPanel(new BorderLayout(5, 0));
        JLabel a = new JLabel(ship,JLabel.CENTER);
        a.setName("ship");
        JLabel n = new JLabel("[" + Integer.toString(i + 1) + "]");
        n.setForeground(Color.BLUE);
        // a.setBorderPainted(false);
        // a.setBackground(Color.white);
        // a.setOpaque(true);
        //a.setIcon(ship,JLabel.CENTER);
        a.setTransferHandler(new TransferHandler("icon"));
        a.addMouseListener(listener);

        p.add(a);
        p.add(n, BorderLayout.LINE_START);
        add(p);

    }
}

目的地(它是标签网格)

public NewAreaGioco(int r,int c, boolean enable){


    this.setLayout(new GridLayout(r,c,1,1));

    for(int i=0;i<r;i++){           
        for(int j=0;j<c;j++){
            JLabel l= new JLabel(" ");          
            l.setSize(30, 30);
            l.setBorder(BorderFactory.createLineBorder(Color.BLUE));
            if(enable)l.setTransferHandler(new TransferHandler("icon"));                
            add(l);
        }//fine for
    }//fine for
}

1 个答案:

答案 0 :(得分:2)

好吧,你不能使用默认的TransferHandler类。你需要自己制作。

我首先看一下Drag and Drop教程的示例页面上的DropDemoListTransferHandler类。

我认为你需要做出一些改变:

  1. 导出图片而不是文本。我认为以上Sergiy提供的链接可能有所帮助。

  2. 关键点在于exportDone(...)方法。您的清理代码会将源组件的图标设置为null。

  3. 您可能需要阅读本教程以了解这两个类的概念。