2

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

        }


    }
4

1 回答 1

3

如果指定的属性存在并且具有适当的 getter,则默认情况下TransferHandler.getSourceActions()的实现返回:COPY

public int getSourceActions(JComponent c) {
PropertyDescriptor prop = getPropertyDescriptor(c);
if (prop != null) {
    return COPY;
}
return NONE;
}

结果,当您MOVEexportAsDrag()处理程序中指定时决定不支持该操作。

您可以覆盖此方法以添加您的源支持的任何操作。例如:

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;
    }
});
于 2012-11-11T18:57:41.137 回答