6

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

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

我需要在我的canImport(..)orimportData(..)方法中知道这一点,以便对传输相同类型的数据或DataFlavor.

我目前实现这一点的方法是劫持 DataFlavor 'Human Readable Field' 并设置一个字符串操作,结果如下:

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

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

谢谢。

4

1 回答 1

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通过返回不同的策略来驱动相同(或放置目标组件)的放置时发生的事情。

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;
        }
     ...
    }
}

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

于 2010-06-17T14:43:48.467 回答