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

JavaFX拖动并单击

颛孙嘉玉
2023-03-14

我试图在JavaFX中执行以下操作。我正在用画布在屏幕上画东西,我希望发生以下事情:

当我点击画布表面时(比如快速按下并释放):有些事情发生了

当我在画布表面拖动时(如按住并移动,然后释放):会发生其他事情

但是如果我拖动,我希望它排除单击操作,所以如果我拖动,如果我单击,会发生什么事情,而不应该发生。不幸的是,当我释放鼠标时,释放和单击事件都会启动,即使我拖动鼠标。

共有3个答案

吕森
2023-03-14

@wcomnisky

非常感谢你的帮助。我最后做的是(我尝试在发布事件处理程序中使用isStillSincePress(),但似乎它仍然将短距离拖动视为单击..尽管我可能做了一些错误的事情)这样做:在鼠标按下处理程序中,我记录按下坐标(可能这个想法类似于isStillSincePressed())方法..可能是根据其名称/说明建议的)pressX=event。getX();pressY=事件。getY()在鼠标释放处理程序中,我这样做:if((按x==event.getX())

向实
2023-03-14

现在有点晚了,但万一有人来这里寻求解决办法。我创建了一个简单的类来处理它。

用法:

clickNotDragDetectingOn(yourNode)
        .withPressedDurationTreshold(150)
        .setOnMouseClickedNotDragged((mouseEvent) -> {
            // logic here
        });

代码:

class MouseClickNotDragDetector {

    private final Node node;

    private Consumer<MouseEvent> onClickedNotDragged;
    private boolean wasDragged;
    private long timePressed;
    private long timeReleased;
    private long pressedDurationTreshold;

    private MouseClickNotDragDetector(Node node) {
        this.node = node;

        node.addEventHandler(MOUSE_PRESSED, (mouseEvent) -> {
            this.timePressed = currentTimeMillis();
        });

        node.addEventHandler(MOUSE_DRAGGED, (mouseEvent) -> {
            this.wasDragged = true;
        });

        node.addEventHandler(MOUSE_RELEASED, (mouseEvent) -> {
            this.timeReleased = currentTimeMillis();
            this.fireEventIfWasClickedNotDragged(mouseEvent);
            this.clear();
        });

        this.pressedDurationTreshold = 200;
    }

    static MouseClickNotDragDetector clickNotDragDetectingOn(Node node) {
        return new MouseClickNotDragDetector(node);
    }

    MouseClickNotDragDetector withPressedDurationTreshold(long durationTreshold) {
        this.pressedDurationTreshold = durationTreshold;
        return this;
    }

    MouseClickNotDragDetector setOnMouseClickedNotDragged(Consumer<MouseEvent> onClickedNotDragged) {
        this.onClickedNotDragged = onClickedNotDragged;
        return this;
    }

    private void clear() {
        this.wasDragged = false;
        this.timePressed = 0;
        this.timeReleased = 0;
    }

    private void fireEventIfWasClickedNotDragged(MouseEvent mouseEvent) {
        if ( this.wasDragged ) {
            debug("[CLICK-NOT-DRAG] dragged!");
            return;
        }
        if ( this.mousePressedDuration() > this.pressedDurationTreshold ) {
            debug("[CLICK-NOT-DRAG] pressed too long, not a click!");
            return;
        }
        debug("[CLICK-NOT-DRAG] click!");
        this.onClickedNotDragged.accept(mouseEvent);
    }

    private long mousePressedDuration() {
        return this.timeReleased - this.timePressed;
    }
}
华俊弼
2023-03-14

方法isStillSincePress()可以与getEventType()一起使用,两者都来自MouseEventAPI。

也许您需要为鼠标在MOUSE_PRESSEDMOUSE_RELEASED之间的移动设置一个阈值,以提高可用性。

 类似资料:
  • 我目前正在使用JavaFX ScrollBar控件,它本身运行良好-但是我对拖动拇指时的“动画”不满意。 更具体地说: 当我快速拖动拇指时,快速加速-拇指动画不会立即跟随,但有点“滞后”-当我停止拖动拇指时的相同行为。。。拇指真正开始/追上预定位置需要一秒钟的时间 这不是繁重的布局计算之类的问题,因为我只是单独渲染ScrollBar而没有任何内容。 是否有一些选项可以让这个“加速动画”/“滞后”消

  • 我是JavaFX和SceneBuilder的新手。在SB中,我试图通过拖放将菜单对象放置在锚窗格中,但由于没有拖放菜单对象实例,因此无法进行此操作。此外,也不允许拖放到库手风琴的层次结构窗格。 当工具从NetBeans“new-empty fxml”启动时,默认情况下会放置AnchorPane。这个问题不存在于其他对象,比如按钮。 我用的是Ubuntu14.04 使用:NetBeans IDE 8

  • 在JavaFX中,我试图通过单击并拖动节点来移动它。如果节点不旋转,它工作得很好,但是当我旋转它时,它开始表现得很奇怪。 在45°左右,当我移动它时,它开始抖动,在60°时,它剧烈地来回抖动。在90°时,只要我开始移动节点,它就会飞离屏幕。 下面是我用来旋转和移动节点的代码。它来自连接到节点的鼠标侦听器。 编辑:这是一些示例输出,以及显示不同节点的图片。 未旋转且缓慢向左移动时的输出: 旋转时缓慢

  • 问题内容: 发现DragEvent发生在哪个TableColumn(在TableView中)的最佳方法是什么? 我希望能够突出显示(例如,将背景颜色更改为黄色,或在列周围显示黄色边框)TableColumn,因为拖动的项目“悬停”在其上方,以便于用户清楚他们正在放的专栏。拖动完成后,我当然必须确保TableView的样式已恢复。 需要明确的是,确切的单元格没有关系-只是列。 问题答案: 为此,您需

  • 问题内容: 我在JLabel中有一个图像。 我想要以下功能。 -我单击JLabel内部的位置(在图像上)。 -按下鼠标按钮,即可更改JLabel中图像的位置。(我将图片拖到JLabel中的不同位置) 好吧,这意味着在许多情况下,图片将被裁剪并且在视野之外。 请告诉我如何实现此功能? 什么是要添加到我的JLabel的正确事件监听器? 问题答案: 这是一个基本的例子… 通过将标签划分为3x3网格来工作

  • 我正在尝试将一个矩形拖动到VBox,然后从VBox内部再次拖动它。 如果矩形被放置在目标VBox之外的任何位置,那么它应该将其位置恢复到它所属的位置:如果它是左VBox的子级,则将其重置回其中;如果它是右VBox的子级,则将其重置回右VBox内部。 第一部分工作正常,我可以将其拖到VBox并将其添加为子级。第二部分是我遇到问题的地方。 重现问题的步骤:<br>1)将左矩形拖动到右矩形的顶部(在VB