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 将数据返回到主类的主要内容,如果未能解决你的问题,请参考以下文章

C# Drag&Drop,由于内容而很难选择可拖动面板

VST实例拖拽(drag&drop)

HTML5 Drag & Drop 在拖动时更改光标(不要使用 UI)

[示例] Drag And Drop for FireMonkey (Win & macOS)

Qt Drag & Drop:添加对拖动文件到应用程序主窗口的支持

HTML5拖拽/拖放(drag & drop)详解