【发布时间】:2016-04-06 08:21:17
【问题描述】:
我是在 java 中使用 DnD 的新手。我正在尝试将图像从标签拖放到另一个标签。第一个标签是源,第二个是目的地。我的麻烦是我需要从源中拖动图像并识别我正在正确的目的地;如果目的地正确,则源图像必须消失,否则必须返回源并使用窗口消息或仅System.out.println() 通知用户。我试过使用TransferHandler、DragSource,但没有得到一个好的结果。
如何将图像从标签拖放到标签?
拖动监听器
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
}
【问题讨论】:
-
请将您的代码发布为SSCCE,以便我们查看问题所在。
-
Here 是图像的 DnD 示例。
-
1) 为了尽快获得更好的帮助,请发帖 minimal reproducible example 或 Short, Self Contained, Correct Example。 2) 例如,获取图像的一种方法是热链接到在this Q&A 中看到的图像。
-
传输数据,而不是example的组件
标签: java image swing drag-and-drop jlabel