0
votes

I have a main GUI See image that is used to load and display (thumbnail) images. I want to make it possible to drag&drop images on my Gui as well. So I copied an example and put it in a class

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

This drag&drop as such works fine. The code:

// Print out the file path
logger.info("File path is: {}", file.getPath());

lists a row of file paths, which I dragged upon my Gui, in the console so drag&drop as such works fine with the files. I use a setter/getter MyVariables.setSelectedFiles(imgs); to make this File[] available "everywhere".

My problem is now to get this File[] with image paths back in my Gui main class immediately after the drop, so I can update the left panel in my Gui. For that updating I have a method public void LoadImages that is used from many parts in my program, which also touches multiple Gui elements, so I can't make that one static. For that I created the setter/getter, but how do I listen in my main Gui thread for the event.dropComplete(true); to act on it. I tried many things like Observers, listeners etc., but I always get the non static method cannot be be referenced from a static context. I do understand that, but how do I get my Gui notified after the drop event has finished, so that it can pick up the data using the getter?

1

1 Answers

0
votes

I finally solved it. The above mentioned FileDragDropListener in my first post is not necessary at all.

When I start my Gui in the main method, I call the below mentioned method rootPanelDropListener.
Note: rootPanel is the name of my entire main screen JPanel.
MyVariables.setSelectedFiles(droppedFilesArray); is a setter I use to be able, in a later stage, to retrieve the data "everywhere" in my program.
loadImages("dropped files"); is the method that loads the images (obvious) and has 3 options: by directory, by selecting (multiple) files, or by dropping the files onto the Gui. Inside the loadimages I check on the parameter "dropped files", then using the getter for the dropped files like 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);
                }
            }
        });
    }