【问题标题】:dragging and dropping from one JavaFX Application to another从一个 JavaFX 应用程序拖放到另一个
【发布时间】:2018-05-23 06:30:56
【问题描述】:

我正在尝试通过拖放将元素从一个 JavaFX 应用程序移动到另一个应用程序,据我所知,这应该不是问题。

所以我有一个类的对象并将它从一个应用程序拖到另一个应用程序,然后将其内容打印到控制台。它看起来不错,我可以通过玩转传输模式将下降到“接受”或“不接受”,这表明机制本身似乎正在工作。 但是当我将对象放在另一个应用程序上时,一堆我认为主要是中文的字母被打印到控制台。这显然是一些编码问题,但我无法真正弄清楚发生了什么,除了两个应用程序主要使用相同的代码库这一事实之外,“中文”字母非常多。对象的 toString 只打印了一个半行的拉丁字符,但在放置时会打印几段“中文”字母。

谁能告诉我这里发生了什么?它只是一个简单的编码 f-up 吗?操作系统(Win7 btw)可能会干扰这里吗?我发现了久违的中国古代智慧了吗?

代码本身比较简单,这里是发件人的代码

setOnDragDetected(event ->
            {
                Dragboard db = startDragAndDrop(TransferMode.ANY);

                ClipboardContent clipboardContent = new ClipboardContent();
                clipboardContent.put(DataFormat.PLAIN_TEXT, treeElement.getEntities());

                db.setContent(clipboardContent);

                System.out.println(db.getContent(DataFormat.PLAIN_TEXT));

                event.consume();
            });

这里来自“接收者”

setOnDragDropped(event ->
    {
        Dragboard db = event.getDragboard();
        if (db.hasContent(DataFormat.PLAIN_TEXT))
        {
            System.out.println(db.getContent(DataFormat.PLAIN_TEXT));
            System.out.println("Accept Drop");
        }

        event.consume();
    });

我真的没有看到任何可以解释我的错误的东西。

【问题讨论】:

  • treeElement.getEntities()返回什么样的对象?您在第二个代码 sn-p 中使用引用类型 Boolean 而不是原始类型 boolean 是否有任何具体原因?
  • 它返回 List,Entity 实现可序列化并且是已经提到的两个应用程序的通用代码库的一部分。

标签: drag-and-drop javafx-8


【解决方案1】:

问题在于使用DataFormat.PLAIN_TEXT。这意味着 JavaFX 认为数据格式就像它在锡上所说的那样:文本,即String 数据。事实并非如此。 DataFormatstatic 成员中没有引用合适的 DataFormat,因此您需要自己创建一个:

final String mimeType = "application/javafx-entrylist"; // TODO: choose properly

// use existing format or introduce new one
DataFormat f = DataFormat.lookupMimeType(mimeType);
final DataFormat format = f == null ? new DataFormat(mimeType) : f;

setOnDragDetected(event -> {
    Dragboard db = startDragAndDrop(TransferMode.ANY);

    ClipboardContent clipboardContent = new ClipboardContent();
    clipboardContent.put(format, treeElement.getEntities());

    db.setContent(clipboardContent);

    System.out.println(db.getContent(format));

    event.consume();
});

setOnDragDropped(event -> {
    Dragboard db = event.getDragboard();
    if (db.hasContent(format)) {
        System.out.println(db.getContent(format));
        System.out.println("Accept Drop");
    }

    event.consume();
});

【讨论】:

  • 谢谢,当各种翻译无法翻译中文时,我已经认为这是DataFormat的问题;)
猜你喜欢
  • 2017-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-14
相关资源
最近更新 更多