两个Swing JFXPanel之间的JavaFx拖放不完全正常工作?

时间:2013-12-13 15:19:54

标签: java swing drag-and-drop javafx

我有一个Swing应用程序,在我的JFrame中有2个JFXPanel,包含2个JavaFx节点,一个TableView和一个WebView。该表包含一个网址列表(将其视为书签列表)。我希望用户将左侧表格中的网址拖到右侧的网页视图中。我根据JavaFx教程设置了拖放事件,并在此处回答了之前的拖放问题。但是,2个JFXPanel似乎无法相互通信。

我可以将表格中的网址拖到我的应用程序之外(例如我的网络浏览器),这样就行了。

我也可以从外部删除网址(例如从网络浏览器的地址栏复制)到网页视图,也可以正确加载它们。

但是当我从表中拖动URL并尝试将它们放在WebView上时,我总是在目标端获得一个空的dragboard(我尝试使用String和Url数据格式,但两者都返回null ,event.getGestureSource()返回为null),尽管源正确填充它(与调试器一步一步观察)。

这可能是两个JFXPanel之间的事实的副作用,并且在它们之间存在使用不同API处理拖放的Swing吗?顺便说一句,我在应用程序的剩余Swing部分中没有任何其他拖放代码,因此不要混合两个事件模型。

提前感谢任何指示,提示或想法。

以下我的事件处理程序的示例代码段:

(在Windows 7 64位计算机上使用JavaFx2.2,Jdk 1.7.0_40)

/* on the source side, the TableView */

// initiate drag
table.setOnDragDetected(new EventHandler<MouseEvent>() {
    public void handle(MouseEvent event) {
    /* Put the selected file or url on the dragboard */
    MyObject tableItem = table.getSelectionModel().getSelectedItem();
            String item = tableItem.getUrlString();
    if (item != null)
    {
        Dragboard db = table.startDragAndDrop(TransferMode.COPY);
        ClipboardContent content = new ClipboardContent();
        content.putString(item);
        content.putUrl(item);
        db.setContent(content);
    }
    event.consume();
     }
});
table.setOnDragDone(new EventHandler<DragEvent>() {
    @Override 
    public void handle(DragEvent event) 
    {
    event.consume();
     }
});


/* on the target side, the WebView */
   webView.setOnDragOver(new EventHandler<DragEvent>() {
    @Override
    public void handle(DragEvent event) {
    Dragboard db = event.getDragboard();
    if (event.getGestureSource() != webView && (db.hasUrl() || db.hasString())) {
        event.acceptTransferModes(TransferMode.ANY);
    } else {
        event.consume();
    }
    }
});

// handle drop
webView.setOnDragDropped(new EventHandler<DragEvent>() {
    @Override
    public void handle(DragEvent event) {
    Dragboard db = event.getDragboard();
    boolean success = false;
    String urlDropped = db.getUrl();
    if (urlDropped == null)
        urlDropped = db.getString();
    if (urlDropped != null)
    {
        webView.getEngine().load(urlDropped);
    }
    event.setDropCompleted(success);
    event.consume();
    }
});

0 个答案:

没有答案