【发布时间】:2013-05-24 16:17:46
【问题描述】:
概述
我正在 Java FX 应用程序中设置拖放。当我尝试从Dragboard 获取自定义数据时,我得到的是java.nio.HeapByteBuffer 而不是Object 作为JavaDoc stuggest。此字节缓冲区不能强制转换为我的原始数据类型。
我在 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 说:
线程“JavaFX 应用程序线程”java.lang.ClassCastException 中的异常:java.nio.HeapByteBuffer 无法转换为 com.example.MyObject
注意:我不在这里使用 ScalaFX,Scala 中的 vanilla JavaFX
【问题讨论】:
标签: java scala drag-and-drop javafx bytebuffer