我试图在JavaFX中执行以下操作。我正在用画布在屏幕上画东西,我希望发生以下事情:
当我点击画布表面时(比如快速按下并释放):有些事情发生了
当我在画布表面拖动时(如按住并移动,然后释放):会发生其他事情
但是如果我拖动,我希望它排除单击操作,所以如果我拖动,如果我单击,会发生什么事情,而不应该发生。不幸的是,当我释放鼠标时,释放和单击事件都会启动,即使我拖动鼠标。
@wcomnisky
非常感谢你的帮助。我最后做的是(我尝试在发布事件处理程序中使用isStillSincePress(),但似乎它仍然将短距离拖动视为单击..尽管我可能做了一些错误的事情)这样做:在鼠标按下处理程序中,我记录按下坐标(可能这个想法类似于isStillSincePressed())方法..可能是根据其名称/说明建议的)pressX=event。getX();pressY=事件。getY()
在鼠标释放处理程序中,我这样做:if((按x==event.getX())
现在有点晚了,但万一有人来这里寻求解决办法。我创建了一个简单的类来处理它。
用法:
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;
}
}
方法isStillSincePress()
可以与getEventType()
一起使用,两者都来自MouseEvent
API。
也许您需要为鼠标在MOUSE_PRESSED
和MOUSE_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