Как узнать компонент перетаскивания в целевой объект TransferHandler? - PullRequest
5 голосов
/ 17 июня 2010

Вопрос касается 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 Ответ

3 голосов
/ 17 июня 2010

Разобрался.

Ключ заключается в создании 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 State.

И сделать эту обертку реализует пользовательский интерфейс, который я назвал 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;
        }
     ...
    }
}

Это довольно сложно объяснить, но, надеюсь, это может помочь.

...