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

JAR*_*ARC 5 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");
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

JAR*_*ARC 3

弄清楚了。

关键是为每个放置目标组件创建一个 DataFlavor。所以这里我有 4 个接受 foo 类型的 drop 的目标、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")
Run Code Online (Sandbox Code Playgroud)

我决定结束我的 Foo 状态课程。

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

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

    OptionStrategy getOptionStrategy();
}
Run Code Online (Sandbox Code Playgroud)

我的Transferable实现(可以被认为是拖动的源)现在可以DataFlavor通过返回不同的策略来驱动相同(或放置目标组件)的放置时发生的情况。

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;
        }
     ...
    }
}
Run Code Online (Sandbox Code Playgroud)

注意下面的源二也支持 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;
        }
     ...
    }
}
Run Code Online (Sandbox Code Playgroud)

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