概述
我正在为Java FX应用程序设置拖放功能。当我尝试从Dragboard
中获取自定义数据时,我得到的是一个java.nio.HeapByteBuffer
而不是JavaDoc所建议的Object
。这个字节缓冲区不能强制转换成我的原始数据类型。
我在Scala中工作,因此语法略有不同,但你可以理解大意。也许正是因为我在Scala中,所以我得到了这个HeapByteBuffer
而不是普通的Object
?
详细说明
好的,现在我要创建一个可拖放的JavaFX控件。我将附加一个String
和一个MyObject
;String
可以被检索,但MyObject
不能。
请注意,我知道有更简单的方法可以附加简单的字符串到拖放板上,但这只是一个示例,以展示也可以从拖放板中检索MyObject
。
在这里,我创建了一个可拖动的自定义组件。
当它被拖动时,会在拖放板上附加两个对象:一个MyObject
和一个String
。
class ToolboxItem
extends Label {
setOnDragDetected(new EventHandler[MouseEvent] {
def handle(event: MouseEvent) {
val dragboard = startDragAndDrop(TransferMode.COPY)
val content = new ClipboardContent()
content.put(DnDTarget.DndString, "sean is cool")
content.put(DnDTarget.DndObject, new MyObject)
dragboard.setContent(content)
event.consume()
}
}
MyObject
非常简单,只是为了让我们开始使用它:
class MyObject
extends Serilaizable
现在,当我接收到拖放事件时,我想从这个事件中获取数据。
(同时,在这里定义我的
DataFormat
)object DnDTarget {
val DndString = new DataFormat("my.custom.dnd.string")
val DndObject = new DataFormat("my.custom.dnd.object")
}
trait DnDTarget
extends Node {
setOnDragOver(new EventHandler[DragEvent]() {
def handle(event: DragEvent) {
if (valid(event)) {
val dragboard = event.getDragboard
val myString = dragboard.getContent(DnDTarget.DndString)
val myObject = dragboard.getContent(DnDTarget.DndObject)
myString.asInstanceOf[String] // no problem
myObject.asInstanceOf[MyObject] // throws exception
event.acceptTransferModes(TransferMode.COPY)
}
event.consume()
}
})
}
好的,那么调用myString.asInstanceOf[String]
是很好的,我得到了我的String
。然而,myObject.asInstanceOf[MyObject]
会抛出一个ClassCastException
,提示:
Exception in thread "JavaFX Application Thread" java.lang.ClassCastException: java.nio.HeapByteBuffer cannot be cast to com.example.MyObject
注意:我这里没有使用ScalaFX,仅仅在Scala中使用了原生JavaFX。