Java:Drag&Drop:从 DropTargetDropEvent 将数据返回到主类
Posted
技术标签:
【中文标题】Java:Drag&Drop:从 DropTargetDropEvent 将数据返回到主类【英文标题】:Java: Drag&Drop: get data back to main class from DropTargetDropEvent 【发布时间】:2020-11-30 01:48:12 【问题描述】:我有一个主 GUI See image,用于加载和显示(缩略图)图像。 我也想让我的 Gui 上的图像拖放成为可能。 所以我复制了一个例子,放在一个类中
public static class FileDragDropListener implements DropTargetListener
@Override
public void drop(DropTargetDropEvent event)
DragDropListener DDL = new DragDropListener();
// Accept copy drops
event.acceptDrop(DnDConstants.ACTION_COPY);
// Get the transfer which can provide the dropped item data
Transferable transferable = event.getTransferable();
// Get the data formats of the dropped item
DataFlavor[] flavors = transferable.getTransferDataFlavors();
// Loop through the flavors
for (DataFlavor flavor : flavors)
try
// If the drop items are files
if (flavor.isFlavorJavaFileListType())
// Get all of the dropped files
List <File> files = (List) transferable.getTransferData(flavor);
//logger.info("length of list ", files.size());
File[] imgs = new File[files.size()];
int counter = 0;
// Loop them through
for (File file : files)
// Print out the file path
logger.info("File path is: ", file.getPath());
imgs[ counter ] = file;
counter++;
MyVariables.setSelectedFiles(imgs);
catch (Exception e)
// Print out the error stack
e.printStackTrace();
// Inform that the drop is complete
event.dropComplete(true);
这种拖放效果很好。代码:
// Print out the file path
logger.info("File path is: ", file.getPath());
在控制台中列出了我拖到 Gui 上的一行文件路径,因此拖放可以很好地处理文件。
我使用 setter/getter MyVariables.setSelectedFiles(imgs);
使这个 File[] 在“任何地方”都可用。
我现在的问题是在我的 Gui 主类中在放置后立即将这个带有图像路径的 File[] 获取回来,这样我就可以更新我的 Gui 中的左侧面板。对于该更新,我有一个方法 public void LoadImages
用于我的程序中的许多部分,它也涉及多个 Gui 元素,所以我不能将其设为静态。为此,我创建了 setter/getter,但是如何在我的主 Gui 线程中监听 event.dropComplete(true);
以对其进行操作。
我尝试了很多东西,比如观察者、听众等,但我总是得到non static method cannot be be referenced from a static context
。
我明白这一点,但是如何在 drop 事件完成后通知我的 Gui,以便它可以使用 getter 获取数据?
【问题讨论】:
【参考方案1】:我终于解决了。 我第一篇文章中提到的 FileDragDropListener 根本不需要。
当我在 main
方法中启动我的 Gui 时,我调用下面提到的方法 rootPanelDropListener
。
注意:rootPanel
是我的整个主屏幕 JPanel 的名称。MyVariables.setSelectedFiles(droppedFilesArray);
是我用来在以后阶段检索程序中“无处不在”的数据的设置器。@ 987654325@ 是加载图像的方法(很明显),它有 3 个选项:按目录、选择(多个)文件或将文件拖放到 Gui。在loadimages
中,我检查了参数“dropped files”,然后使用 getter 获取已删除的文件,例如 files = MyVariables.getSelectedFiles();
public void rootPanelDropListener()
//Listen to drop events
rootPanel.setDropTarget(new DropTarget()
public synchronized void drop(DropTargetDropEvent evt)
try
evt.acceptDrop(DnDConstants.ACTION_COPY);
List<File> droppedFiles = (List<File>)
evt.getTransferable().getTransferData(DataFlavor.javaFileListFlavor);
for (File file : droppedFiles)
logger.debug("File path is: ", file.getPath());
File[] droppedFilesArray = (File[]) droppedFiles.toArray(new File[droppedFiles.size()]);
MyVariables.setSelectedFiles(droppedFilesArray);
loadImages("dropped files");
catch (Exception ex)
ex.printStackTrace();
logger.error("Drag drop on rootpanel error ", ex);
);
【讨论】:
以上是关于Java:Drag&Drop:从 DropTargetDropEvent 将数据返回到主类的主要内容,如果未能解决你的问题,请参考以下文章
HTML5 Drag & Drop 在拖动时更改光标(不要使用 UI)
[示例] Drag And Drop for FireMonkey (Win & macOS)