【GWT2.4、Chrome、Firefox】
やあ、
TreeView でツリー項目のドラッグ アンド ドロップを実装しています。ツリービューの横に、項目をインスタンス化し、ドラッグ アンド ドロップ ハンドラーを適用する管理クラスがあります。
これは次のようになります。
private CustomTreeItem createItem(Data data){
CustomTreeItem item = new CustomTreeItem(data);
if(dndApplicable())
setupDndHandlers(item);
return item:
}
private void setupDndHandlers(item){
// The tree item's widget is a FocusPanel
FocusPanel wrapper = item.getFocusPanel();
wrapper.getElement().setDraggable(Element.DRAGGABLE_TRUE);
// Setup the data and drag image when drag starts
wrapper.addDragStartHandler(new DragStartHandler() {
@Override
public void onDragStart(DragStartEvent event) {
event.getDataTransfer().setDragImage(wrapper.getElement(), 0, 0);
event.setData("item_id", item.getData().getId().toString());
}
});
// Each tree item can also be a drop target, so we add handlers accordingly
wrapper.addDragLeaveHandler(new DragLeaveHandler() {
public void onDragLeave(DragLeaveEvent event) {
wrapper.removeStyleName("dragover");
wrapper.removeStyleName("undroppable");
}
});
// Each tree item can also be a drop target, so we add handlers accordingly
wrapper.addDragOverHandler(new DragOverHandler() {
public void onDragOver(DragOverEvent event) {
if (isDroppable(event.getDataTransfer().getData("item_id"), item))
wrapper.addStyleName("dragover");
else
wrapper.addStyleName("undroppable");
}
});
// Each tree item can also be a drop target, so we add handlers accordingly
wrapper.addDropHandler(new DropHandler() {
public void onDrop(DropEvent event) {
String id = event.getDataTransfer().getData("item_id");
if (isDroppable(id, item)) {
proceedWithDrop(id, item);
}
});
}
このisDroppable
関数はいくつかのことをチェックします。1 つ目は、データが null または空であるかどうかです。
Firefox では問題なくイベント データにアクセスできますが、Chrome では DragOverHandler (またはそのことについては DragEnterHandler) 内で、dataTransfer を介してアクセスされるデータは空です。ただし、DropHandler 内では、データは正しいです。
私はそれを見なかったので、明らかなものを見逃していますか?
ありがとうございます。