Đã tìm ra.
Điều quan trọng là tạo thành phần DataFlavor cho mỗi mục tiêu thả. Vì vậy, ở đây tôi có 4 mục tiêu chấp nhận các loại foo, 3 nút và 1 bảng điều khiển.
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")
Tôi quyết định kết thúc lớp học Foo.
Và làm cho trình bao bọc này triển khai giao diện tùy chỉnh mà tôi đặt tên là TransferDataStrategy. Làm điều này bây giờ cho phép tôi thực hiện các hành động khác nhau trong hàm importData (...) cho cùng một hương vị.
public interface TransferDataStrategy<MODEL>
{
MODEL getModel();
OptionStrategy getOptionStrategy();
}
My Transferable
triển khai (có thể được coi là nguồn gốc của sự kéo) bây giờ có thể lái xe gì xảy ra trên thả cho cùng DataFlavor
(hoặc Drop Component Target) bằng cách trả lại chiến lược khác nhau.
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;
}
...
}
}
Lưu ý Nguồn hai bên dưới cũng hỗ trợ FooCopyButtonFlavor, nhưng trả về một chiến lược khác.
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;
}
...
}
}
Điều này khá khó giải thích nhưng hy vọng nó có thể hữu ích.