概要
Java FX アプリケーションでドラッグ & ドロップを設定しています。からカスタム データを取得しようとすると、JavaDoc stuggestの代わりにDragboard
が取得されます。このバイト バッファーは、元のデータ型にキャストできません。java.nio.HeapByteBuffer
Object
私は Scala で作業しているので、構文は少し異なりますが、理解できます。HeapByteBuffer
ただし、通常の代わりにこれを取得しているのは、おそらく Scala にいるためですObject
か?
詳細
では、ドラッグ アンド ドロップできる JavaFX コントロールを作成します。String
aと a MyObject
;を付けます。はString
取得できますが、 は取得MyObject
できません。
単純な文字列をドラッグボードに接続する簡単な方法があることは承知しています。これはMyObject
、ドラッグボードからも取得できることを示す単なる例です。
ここでは、ドラッグできるカスタム コンポーネントを作成します。MyObject
ドラッグすると、aと aの 2 つのオブジェクトがドラッグボードにアタッチされます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 のバニラ JavaFX です。