此功能的目的是使我的按钮能够在窗格内拖动,但初始拖动位置不正确;我需要那两个鼠标x y点来使它正确,但我不能将它们传递给我的拖动事件; 我知道我可以创建自己的按钮类来扩展和覆盖通用的Button类;但是,还有其他方法可以解决这个问题吗?
public void editTable(Button mytablebutton){
Button table = mytablebutton;
double mouseClickPointX;
double mouseClickPointY;
table.setOnMousePressed(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent e) {
System.out.println( e.getX());
System.out.println(e.getY());
// mouseClickPointX = e.getX(); --> This is the thing i want to do, but cant
// mouseClickPointY = e.getY(); --> This is the thing i want to do, but cant
}
});
table.setOnMouseDragged(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent e) {
double x=table.getBoundsInParent().getMinX();
double y=table.getBoundsInParent().getMinY();
table.setLayoutX(x+e.getX()-mouseClickPointX());
table.setLayoutY(y+e.getY()-mouseClickPointY());
}
});
}
}
答案 0 :(得分:0)
您不能完全按照您尝试的方式执行此操作,因为您无法访问匿名类中的非最终变量。
修复是使用对数据的可变对象的最终引用。 javafx.beans.property.DoubleProperty
效果很好:
final DoubleProperty mouseClickPointX = new SimpleDoubleProperty();
然后在mousePressed
处理程序中执行
mouseClickPointX.set(e.getX());
并在mouseDragged
处理程序中执行
table.setLayoutX(x+e.getX()-mouseClickPointX.get());
显然,为y做同样的事情。
您也可以使用ObjectProperty<Point2D>
,或者只创建自己的简单可变Point类。
答案 1 :(得分:0)
我知道有点晚了,但对于有类似问题的其他人来说。
您应该尝试将共享变量声明为静态。
我认为问题在于,因为mouseDragged来自MouseMotionListener接口并且mousePressed来自MouseListener,所以通过addMouseListener和addMouseMotionListener将该类作为单独的对象添加到窗格两次。声明变量static使其成为从类构造的所有对象共享的公共变量。