JavaFX Перетаскивание неукрашенной сцены «Ошибка прохождения» - PullRequest
0 голосов
/ 30 января 2019

У меня есть неокрашенная сцена с пользовательским заголовком.Этот заголовок содержит «IconButtons», которые являются просто StackPanes, содержащими ImageViews.

Я также использую этот код, чтобы сделать сцену перетаскиваемой через заголовок (код Котлина):

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 это не кажется проблемой.Я не понимаю, почему это так, и как это исправить.

1 Ответ

0 голосов
/ 31 января 2019

Проверка команды pickResult работает нормально (спасибо, Фабиан):

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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...