我有这个简单的方法,使拖动节点:鼠标拖动没有被按下?
private void setNodeDraggable(final Node node) {
EventHandler<MouseEvent> dragHandler = new EventHandler<MouseEvent>() {
private Point2D dragAnchor;
@Override public void handle(MouseEvent event) {
EventType<? extends MouseEvent> type = event.getEventType();
if (type == MOUSE_PRESSED) {
dragAnchor = new Point2D(event.getSceneX(), event.getSceneY());
} else if (type == MOUSE_DRAGGED) {
try {
stage.setX(event.getScreenX() - dragAnchor.getX());
stage.setY(event.getScreenY() - dragAnchor.getY());
} catch (Exception e) { ///catch all to track the occasional exception
LOG.error("in setNodeDraggable: {},{},{}", stage, event, dragAnchor);
}
}
}
};
node.setOnMouseDragged(dragHandler);
node.setOnMousePressed(dragHandler);
}
但是异常是从时间抛出时间在try块和日志显示dragAnchor
为空。
据我所见,唯一的解释是MOUSE_DRAGGED
已被检测到,没有相应的事先MOUSE_PRESSED
事件。
这怎么可能?我应该改变什么吗?
用JavaFX 2.2.45在win8上测试你的代码。没有例外。您还应该指定您的JavaFX环境和版本。 –
@UlukBiy感谢您的尝试。我只是偶尔得到异常,而不是每次 - 我在Win7 x64上使用Java 8 b119运行它。 – assylias
我在JavaFX 2.2.45和Java 8 b123上都试过,并且无法生成异常。我尝试着对另一个组件进行全面拖拽,看看是否有所作为。也许看看你是否可以创建一个完整的(但很短)的例子来说明问题。也许也尝试创建一个ObjectProperty作为你的dragAnchor;那么您可以为mousePressed和mouseDragged创建不同的处理程序,但也可以通过dragAnchor注册一个侦听器来查看它何时更改。 –