当前位置: 首页 > 知识库问答 >
问题:

JavaFX拖拽未修饰阶段“故障”问题

韦棋
2023-03-14

我有一个未装饰的舞台,里面有一个定制的标题栏。这个标题栏包含“图标按钮”,它们只是保存图像视图的堆叠窗格。

我还使用此代码通过标题栏(静态编程语言代码)使舞台可拖动:

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个答案

林意蕴
2023-03-14

检查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
    }
}
 类似资料:
  • 问题内容: 我有一个未经修饰的JavaFX Stage,还有我自己的最小化,最大化和关闭按钮。但不幸的是,与经过修饰的行为相比,在Windows 7中单击任务栏图标不会自动最小化该阶段。 通过单击任务栏图标,是否可以通过纯Java代码最小化未修饰的阶段?如果不是,我该如何使用JNA? 编辑: 好的,我一直在尝试使用JNA解决此问题,但是几乎没有C / C ++ / JNA完成,因此设置起来有些麻烦

  • 我有一扇没有装饰的窗户: 我想知道我怎样才能把它做成一扇可拖动的未装饰窗户?我想在用户用鼠标右键选择窗口时更改其位置,然后在按住鼠标键的同时移动鼠标。 附言:我测试了这个解决方案,但它不起作用:

  • 我有一个未装饰的JavaFX舞台,我自己的最小化,最大化 有没有办法通过单击任务栏图标来最小化纯Java代码未修饰的阶段?如果不是的话,我该怎么做,比如说,JNA? 编辑:好的,我一直在尝试用JNA解决这个问题,但由于几乎没有C/C/JNA,我在设置这个方面有点麻烦。如果有人帮我把这些东西拼凑起来,我将不胜感激。。 到目前为止,这是我的代码: 编辑2:我最终在这一点上做得更进一步,但当我重新设置W

  • 这是我使用JavaFX的第二天,如果这似乎是一个太常见的知识问题的话。提前谢谢大家。 ..

  • 我是JavaFX技术的新手,目前我正在开发JavaFX应用程序,其中有一个未装饰的阶段,我可以使用下面的代码在屏幕上移动它,但我无法从右下角调整此窗口的大小,有人能给我建议解决方案吗。

  • 问题内容: 我试图发出Windows PC Toast通知。现在,我混合使用了Swing和JavaFX,因为我没有找到使用FX制作未修饰窗口的方法。我更喜欢只使用JavaFX。 那么,如何制作未装饰的窗户? 编辑: 我发现您可以直接使用创建舞台。 现在我所需要知道的是如何初始化工具箱,以便可以在中调用我的方法。(其中) 我通常会打电话给我,但是这使我无法创建和初始化。 那么,如何做这些事情以允许我