当前位置: 首页 > 知识库问答 >
问题:

您如何创建一个javafilelist风味对象以放入JList中?

段干飞翮
2023-03-14

我的应用程序中并排有一个JTree和JList。当我将节点从JTree拖到JList时,我已添加到List的节点

System.out.println(Arrays.toString(info.getTransferable().getTransferDataFlavors())

返回:

[javax.activation.ActivationDataFlavor[mimetype=application/x-java-jvm-local-objectref;representationclass=java.io.InputStream]

我如何才能让我的JList接受我的Jtree的投递?我试图创建自己的dataflavor,但没有成功——这在我粘贴的代码中被注释掉了。

  static class ListTransferHandler extends TransferHandler {

    Logger lgs = null;

    int action;

    public ListTransferHandler(int action) {
        this.action = action;
        lgs = Logger.getLogger("ListTransferHandler Logger");
        lgs.setLevel(ALL);
        lgs.log(Level.INFO, "ListTransferHandler object created");
    }

    @Override
    public boolean canImport(TransferHandler.TransferSupport info) {
        //  lgs.log(Level.INFO, "can import called");

        if (!info.isDrop()) {
            return false;
        }

        info.setShowDropLocation(true);

        System.out.println(Arrays.toString(info.getTransferable().getTransferDataFlavors()));

        if (!info.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
            lgs.log(Level.INFO, "Flavor not supported");
            return false;
        } else {
            lgs.log(Level.INFO, "Flavor supported");
        }

        boolean actionSupported = (action & info.getSourceDropActions()) == action;

        if (!actionSupported) {
            info.setDropAction(action);
            return false;
        }

        return true;

    }

    @Override
    public boolean importData(TransferHandler.TransferSupport support) {

        if (!canImport(support)) {
            return false;
        }

        JList.DropLocation dl = (JList.DropLocation) support.getDropLocation();

        int index = dl.getIndex();

        List<File> fileList;

        try {
            fileList = (List) support.getTransferable().getTransferData(DataFlavor.javaFileListFlavor);
        } catch (UnsupportedFlavorException | java.io.IOException e) {
            return false;
        }

        JList list = (JList) support.getComponent();
        DefaultListModel model = (DefaultListModel) list.getModel();
        //insertElementAt(data, index);

        for (File file : fileList) {
            model.addElement(file.getName());
        }

        return true;
    }
}

static class SelectedFileTransferHandler extends TransferHandler {

    //private DataFlavor localObjectFlavor = new DataFlavor( List.class, "Array of items");
    Logger lgs = null;

    public SelectedFileTransferHandler() {
        lgs = Logger.getLogger("SelectedFileTransferHandler Logger");
        lgs.setLevel(ALL);
        //  lgs.log(Level.INFO, "Tranfer object created");

    }

    @Override
    public int getSourceActions(JComponent comp) {
        // lgs.log(Level.INFO, "got source actions");
        return COPY;
    }

    @Override
    public Transferable createTransferable(JComponent comp) {
        //  lgs.log(Level.INFO, "creating tranferable");
        JTree tree = (JTree) comp;
        TreePath[] paths = tree.getSelectionPaths();
        List<File> nodesAsFiles = null;

        if (paths != null) {
            nodesAsFiles = new ArrayList<File>();
            for (TreePath path : paths) {
                nodesAsFiles.add((File) path.getLastPathComponent());
            }

            //File node = (File) paths.getLastPathComponent();
            //  copies.add(node);
            for (File file : nodesAsFiles) {
                System.out.println(file.getPath());
            }

        }
        List<File> defensiveCopyOfNodesAsFiles = null;
        if (nodesAsFiles != null) {
            defensiveCopyOfNodesAsFiles = new ArrayList(nodesAsFiles);
        }
        return new DataHandler(defensiveCopyOfNodesAsFiles, javaJVMLocalObjectMimeType);
        //return new DataHandler(transferedObjects, localObjectFlavor.getMimeType());
    }

}

共有1个答案

东方吕恭
2023-03-14

我很惊讶,我找不到一种方法将我的JTree中的文件列表制作成javaFileListFlavorDataFlavor以传递给我的JList的filehandler的canimportimport Data方法。为了解决我的问题,我创建了一个自定义DataFlavor,如类中所示,ArrayListTransferHandler.java

当在JTree的传输处理程序中调用createTransportable()时,它将把一个List对象传递给实现Transportable的类。后者返回自定义DataFlavor的可转移。我还没有完成所有的构建,但是上面代码中的代码示例(根据我的日志)似乎已经解决了我的问题。Jlist现在正在接受我想要发送的数据。

 类似资料:
  • 我有一个名为LoginFrame的类,它必须显示一个包含登录表单的JFrame对象: abstrac类SingleFrameApplication自动为我提供JFrame对象,我在该对象上设置了一些属性(维度和标题)。 然后尝试添加两个JLabel对象,分别显示字符串“username:”和“password:** TNX 安德里亚

  • 问题内容: 我是一个自学者。当前,我正在制作一个需要矩阵型数据库的GUI项目。 我想学习如何创建一个可以在arraylist中存储多个对象的类。 这是我的示例代码。请注意,这只是我的尝试。该代码尚未完成,因此无法正常工作。 谢谢你的热心帮助。 }} 问题答案: 我认为一种更好的方法是创建一个用户信息类来存储特定用户的信息。 然后将其放入ArrayList中。 然后,对于您当前的方法,您可以

  • 问题内容: 我正在尝试 使用用户输入 创建一个 新对象。 我尝试将用户输入分配给变量,但是在声明新对象时 不知道如何将变量添加 到新对象。这只是我需要帮助的代码部分。我需要帮助的部分是 第8行。 我知道我可以随意放置一些内容,当我使用set方法时,它将覆盖,但这不是我想要的。先感谢您 问题答案: 这取决于类的实现方式。如果Expects 参数的构造函数,则调用传递它们而不指定类型的构造函数。 请注

  • 不过就是创建结构体的时候,根据每个对象的特征赋值不同的属性罢了 // 3.创建一个结构体变量 p1 := Person{"lnj", 33} per.say() p2 := Person{"zs", 18} per.Say()

  • 我有一个gradle.build,它适用于主要目标。我想为皮肤版本添加味道。我已经将它们添加到gradle构建中,但我不明白我应该将另一个版本的文件放在哪里,在哪个文件夹中,它应该是什么名称?让我们考虑一个例子:主包com.example.app与android应用程序通用的项目结构(我在Source ceSets中这样做)。据我所知,我应该创建文件夹(不是一组子文件夹)com.example.a

  • 问题内容: Play框架文档在模块创建方面有些薄弱。 如何创建一个模块? 我已经读到大型应用程序可以分为多个模块,如何? 模块不能/不能做什么?(是否可以访问低级API?) 播放模块可以公开抽象的JPA类吗? 打包模块的最佳方法是什么? 如何部署/分配播放模块? 我想您有个主意…向我们介绍所有使用Playframework的模块。 问题答案: 如何创建一个模块? 我已经读到大型应用程序可以分为多个