【问题标题】:JavaFX Dragging Undecorated Stage "Fallthrough" ProblemJavaFX 拖拽未装饰的舞台“Fallthrough”问题
【发布时间】:2019-01-30 20:33:26
【问题描述】:

我有一个未装饰的舞台,其中有一个自定义标题栏。这个标题栏包含“IconButtons”,它们只是持有 ImageViews 的 StackPanes。

我还使用此代码通过标题栏(Kotlin 代码)使舞台可拖动:

fun makeDraggable(stage: Stage, byNode: Node) {

    val dragDelta = Delta()

    byNode.setOnMousePressed { e ->
        if (stage.isFullScreen || stage.isMaximized) {
            return@setOnMousePressed
        }

        dragDelta.x = stage.x - e.screenX
        dragDelta.y = stage.y - e.screenY
    }

    byNode.setOnMouseDragged { e ->
        if (stage.isFullScreen || stage.isMaximized) {
            return@setOnMouseDragged
        }

        stage.x = e.screenX + dragDelta.x
        stage.y = e.screenY + dragDelta.y
    }
}

现在,问题是即使鼠标悬停在这些“图标按钮”之一上,舞台也是可拖动的。使用普通的 JavaFX 按钮,这似乎不是问题。我不明白为什么会这样,以及如何解决它。

【问题讨论】:

  • 假设事件的工作方式与 java 中的相同,您应该能够使用按钮的事件或检查事件的 pickResultButtons 之一或其后代之一.

标签: javafx kotlin


【解决方案1】:

检查 pickResult 似乎工作正常(感谢 fabian):

fun makeDraggable(stage: Stage, byNode: Node) {

    val dragDelta = Delta()

    var validTarget = true

    byNode.setOnMousePressed { e ->
        if (stage.isFullScreen || stage.isMaximized) {
            return@setOnMousePressed
        }

        val pickedNode = e.pickResult.intersectedNode

        if (pickedNode is IconButton) {
            validTarget = false
            return@setOnMousePressed
        }
        if (pickedNode.parent is IconButton) {
            validTarget = false
            return@setOnMousePressed
        }

        dragDelta.x = stage.x - e.screenX
        dragDelta.y = stage.y - e.screenY
    }

    byNode.setOnMouseReleased { e ->
        if (stage.isFullScreen || stage.isMaximized) {
            return@setOnMouseReleased
        }
        validTarget = true
    }

    byNode.setOnMouseDragged { e ->
        if (stage.isFullScreen || stage.isMaximized) {
            return@setOnMouseDragged
        }

        if (!validTarget) {
            return@setOnMouseDragged
        }

        stage.x = e.screenX + dragDelta.x
        stage.y = e.screenY + dragDelta.y
    }
}

【讨论】:

    猜你喜欢
    • 2013-08-12
    • 2013-09-18
    • 2015-12-05
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多