我想将文件移动到一个窗格中,但由于某种原因它不会触发这些事件,我已经很困惑了,该窗格处理除 setOnDragOver、setOnDragEntered、setOnDragExited、setOnDragDropped 之外的所有事件
val drag = Pane().apply {
id = "dragFile"
layoutX = 28.0
layoutY = 58.0
val dragImage = ImageView().apply {
id = "drag"
fitWidth = 80.0
fitHeight = 80.0
layoutX = 60.0
layoutY = 20.0
}
val dragText = Label("text").apply {
id = "dragText"
layoutX = 29.0
layoutY = 100.0
}
children.addAll(dragImage, dragText)
setOnDragOver { event ->
if (event.dragboard.hasFiles()) {
event.acceptTransferModes(TransferMode.COPY)
}
event.consume()
}
setOnDragEntered { event ->
if (event.dragboard.hasFiles()) {
id = "dragFileActive"
}
event.consume()
}
setOnDragExited { _ -> id = "dragFile" }
setOnDragDropped { event ->
if (event.dragboard.hasFiles()) {
event.isDropCompleted = true
handler(event.dragboard.files)
}
event.consume()
}
}
我尝试向控制台输出一条消息,即使这样也不起作用。
setOnDragOver { println("drag over") }
setOnDragEntered { println("drag entered") }
setOnDragExited { println("drag exited") }
setOnDragDropped { println("drag drop") }
import javafx.application.Application
import javafx.scene.Scene
import javafx.scene.input.TransferMode
import javafx.scene.layout.Pane
import javafx.stage.Stage
import java.io.File
class FileDropApp : Application() {
override fun start(primaryStage: Stage) {
val pane = Pane().apply {
id = "importFile"
layoutX = 273.0
layoutY = 135.0
prefWidth = 400.0
prefHeight = 300.0
style = "-fx-background-color: lightgray;"
val dropArea = Pane().apply {
id = "dragFile"
layoutX = 50.0
layoutY = 50.0
prefWidth = 300.0
prefHeight = 200.0
style = "-fx-background-color: white; -fx-border-color: black;"
setOnDragOver { event ->
if (event.dragboard.hasFiles()) {
event.acceptTransferModes(TransferMode.COPY)
}
event.consume()
}
setOnDragEntered { event ->
if (event.dragboard.hasFiles()) {
style = "-fx-background-color: lightgreen; -fx-border-color: black;"
}
}
setOnDragExited { _ -> style = "-fx-background-color: white; -fx-border-color: black;" }
setOnDragDropped { event ->
if (event.dragboard.hasFiles()) {
val files = event.dragboard.files
event.isDropCompleted = true
handleFiles(files)
} else {
event.isDropCompleted = false
}
event.consume()
}
}
children.addAll(dropArea)
}
val scene = Scene(pane, 800.0, 600.0)
primaryStage.title = "File Drop Example"
primaryStage.scene = scene
primaryStage.show()
}
private fun handleFiles(files: List<File>) {
files.forEach { file ->
println("File dropped: ${file.absolutePath}")
}
}
}
fun main() {
Application.launch(FileDropApp::class.java)
}
前言:您已在评论中确认“以管理员身份”运行应用程序是问题的根源,因此我将猜测转向答案。
因此,您的问题是将文件从桌面拖动到应用程序,但您的应用程序没有收到任何事件。鉴于您的代码适用于多个操作系统上的其他代码,您的问题可能与您的环境有关,而不是代码本身。现在,您的问题中实际上没有足够的信息来给出明确的答案,但由于问题专门与 Windows 上的拖放有关,因此可能有一个原因:
您正在使用管理权限运行应用程序。
在 Windows 上,不允许从非提升应用程序拖放到提升应用程序。其他操作系统上可能有类似的规则,我不确定。
尽管我假设您不是故意以管理权限运行您的应用程序。但是,如果您从提升的进程启动应用程序,那么您的应用程序将继承提升的状态。检查您的 IDE 或用于启动应用程序的任何内容是否已提升。如果是,请尝试在没有管理权限的情况下重新启动 IDE(或其他)。或者,如果您出于某种原因需要提升您的 IDE(或其他),请尝试以其他方式启动您的应用程序(例如,从不以管理员身份运行的终端)。