不响应 setOnDrag Javafx 事件

问题描述 投票:0回答:1

我想将文件移动到一个窗格中,但由于某种原因它不会触发这些事件,我已经很困惑了,该窗格处理除 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)
}
javafx
1个回答
0
投票

前言:您已在评论中确认“以管理员身份”运行应用程序是问题的根源,因此我将猜测转向答案。


因此,您的问题是将文件从桌面拖动到应用程序,但您的应用程序没有收到任何事件。鉴于您的代码适用于多个操作系统上的其他代码,您的问题可能与您的环境有关,而不是代码本身。现在,您的问题中实际上没有足够的信息来给出明确的答案,但由于问题专门与 Windows 上的拖放有关,因此可能有一个原因:

您正在使用管理权限运行应用程序。

在 Windows 上,不允许从非提升应用程序拖放到提升应用程序。其他操作系统上可能有类似的规则,我不确定。

尽管我假设您不是故意以管理权限运行您的应用程序。但是,如果您从提升的进程启动应用程序,那么您的应用程序将继承提升的状态。检查您的 IDE 或用于启动应用程序的任何内容是否已提升。如果是,请尝试在没有管理权限的情况下重新启动 IDE(或其他)。或者,如果您出于某种原因需要提升您的 IDE(或其他),请尝试以其他方式启动您的应用程序(例如,从不以管理员身份运行的终端)。

© www.soinside.com 2019 - 2024. All rights reserved.