2

テキストをあるjlabelから別のjlabelに移動したいのですが、何らかの理由でコピーのみが機能し、移動はできません。私は transferhandler を使用しているので、handler.exportAsDrag(comp, e, TransferHandler.MOVE); で 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

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 に答える