我有一个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();
}
});