我想将文本从一个jlabel移动到另一个jlabel,但由于某种原因,只有副本工作而不移动。我在handler.exportAsDrag(comp,e,TransferHandler.MOVE)中使用transferhandler;只有TransferHandler.COPY可以使用。
add1 = new JLabel("", JLabel.CENTER);
add1.setTransferHandler(new TransferHandler("text"));
add1.setBorder(b2);
add2 = new JLabel("", JLabel.CENTER);
add2.setTransferHandler(new TransferHandler("text"));
add2.setBorder(b2);
MouseListener listener = new DragMouseAdapter();
add1.addMouseListener(listener);
add2.addMouseListener(listener);
panel2a.add(add1);
panel2a.add(add2);
使用此私有内部类
拖动它们private class DragMouseAdapter extends MouseAdapter
{
public void mousePressed(MouseEvent e)
{
JComponent comp = (JComponent)e.getSource();
TransferHandler handler = comp.getTransferHandler();
//c.setOpaque(true);
handler.exportAsDrag(comp, e, TransferHandler.MOVE);
}
}
答案 0 :(得分:3)
如果指定的属性存在且具有正确的getter,则TransferHandler.getSourceActions()的实现默认返回COPY
:
public int getSourceActions(JComponent c) {
PropertyDescriptor prop = getPropertyDescriptor(c);
if (prop != null) {
return COPY;
}
return NONE;
}
因此,当您在MOVE
中指定exportAsDrag()
时,处理程序会决定不支持该操作。
您可以覆盖此方法以添加源支持的任何操作。例如:
add1.setTransferHandler(new TransferHandler("text") {
@Override
public int getSourceActions(JComponent c) {
return COPY | MOVE;
}
});
编辑:实施exportDone
this.setTransferHandler(new TransferHandler("text") {
@Override
protected void exportDone(JComponent source, Transferable data, int action) {
if (action == MOVE){
((JLabel) source).setText("");
}
}
@Override
public int getSourceActions(JComponent c) {
return COPY | MOVE;
}
});