JLabel transferhandler复制工作但不动

时间:2012-11-11 17:27:34

标签: java swing jlabel move

我想将文本从一个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);

        }


    }

1 个答案:

答案 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;
    }
});