如何找到放置目标TransferHandler中的拖动源组件?

时间:2010-06-17 10:42:03

标签: java drag-and-drop java-5

问题是关于 Java 5 和Drag n Drop。

有没有办法确定放置目标TransferHandler中的拖动源组件

我需要在canImport(..)importData(..)方法中了解这一点,以便针对相同类型或DataFlavor的传输数据采取不同的操作。

我目前实现这一目标的方法是劫持DataFlavor“人类可读字段”并设置字符串操作,结果如下:

DataFlavor localCopyFooFlavor = new DataFlavor(Foo.class, "COPY");
DataFlavor localEditFooFlavor = new DataFlavor(Foo.class, "EDIT");

然后使用此字段决定要采取的操作。 我很确定这是错误的。

感谢。

1 个答案:

答案 0 :(得分:3)

想出来。

关键是为每个放置目标组件创建一个DataFlavor。所以这里我有4个目标接受foo类型,3个按钮和1个面板。

fooCopyButtonFlavor   = new DataFlavor(FooCopyButtonTransferData.class,   "Foo 'Copy Button' Transfer Data");
fooEditButtonFlavor   = new DataFlavor(FooEditButtonTransferData.class,   "Foo Entry 'Edit Button' Transfer Data");
fooDeleteButtonFlavor = new DataFlavor(FooDeleteButtonTransferData.class, "Foo Entry 'Delete Button' Transfer Data");
fooDialogPanelFlavor  = new DataFlavor(FooDialogPanelTransferData.class, "Foo Entry 'Dialog Panel' Transfer Data")

我决定结束我的Foo州级课程。

让这个包装器实现一个名为TransferDataStrategy的自定义接口。现在这样做允许我在importData(...)函数中执行相同风格的不同操作。

public interface TransferDataStrategy<MODEL>
{
    MODEL getModel();

    OptionStrategy getOptionStrategy();
}

我的Transferable实现(可以被认为是拖动的来源)现在可以通过返回不同的策略来驱动相同DataFlavor(或丢弃目标组件)的丢弃。< / p>

public class SourceOneTransferOperation implements Transferable
{
    public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException
    {
        if (flavor.equals(FooDataFlavor.fooCopyButtonFlavor)) {
            TransferDataStrategy<Foo> tds = new FooCopyAAA(model);
            return tds;
        }
     ...
    }
}

注意来源二下面也支持FooCopyButtonFlavor,但返回不同的策略。

public class SourceTwoTransferOperation implements Transferable
{
    public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException
    {
        if (flavor.equals(FooDataFlavor.fooCopyButtonFlavor)) {
            TransferDataStrategy<Foo> tds = new FooCopyBBB(model);
            return tds;
        }
     ...
    }
}

这很难解释,但希望它可能会有所帮助。