概述
我正在 Java FX 应用程序中设置拖放。当我尝试从JavaDoc stuggest中获取自定义数据时,Dragboard
我得到的是 ajava.nio.HeapByteBuffer
而不是a。Object
此字节缓冲区无法转换为我的原始数据类型。
我在 Scala 工作,所以语法有点不同,但你明白了。但是,也许是因为我在 Scala 中,所以我得到了这个HeapByteBuffer
而不是常规的Object
?
细节
好的,这里我要创建可以拖放的JavaFX控件。我要附上 aString
和 a MyObject
; String
可以检索,而不能检索MyObject
。
请注意,我知道有更简单的方法可以将简单的字符串附加到拖动板上,这只是一个示例,表明它也MyObject
应该可以从拖动板上检索。
在这里,我创建了一个可以拖动的自定义组件。拖动时,拖动板上会附加两个对象: aMyObject
和 a 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
现在,当我收到拖动事件时,我想从事件中获取这些数据。
(另外,在这里我定义了 my 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
说法:
线程“JavaFX 应用程序线程”中的异常 java.lang.ClassCastException:java.nio.HeapByteBuffer 无法转换为 com.example.MyObject
注意:我在这里没有使用 ScalaFX,Scala 中的 vanilla JavaFX