将鼠标按下事件的值传递给鼠标拖动事件

时间:2014-01-04 07:58:18

标签: javafx

此功能的目的是使我的按钮能够在窗格内拖动,但初始拖动位置不正确;我需要那两个鼠标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());

               }

           });                   



     }

}   

2 个答案:

答案 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使其成为从类构造的所有对象共享的公共变量。