2010-06-17 75 views
5

问题是关于Java 5和Drag n Drop。如何找到拖放目标TransferHandler中的拖动源组件?

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

我需要知道这在我的canImport(..)importData(..)方法,以采取不同的动作传输相同类型的数据或DataFlavor

我当前已达到了这个问题的方法是劫持的DataFlavor“人类可读场”,并设置一个串动,造成这样的事情:

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

然后使用这个字段来决定采取何种行动。 我很肯定这是错误的。

谢谢。

回答

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

注意源码2下面还支持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; 
     } 
    ... 
    } 
} 

这是很难解释,但希望它可以帮助。