【问题标题】:How to create a MouseMotionListener that only accepts diagonal mouse movement in Java?如何在 Java 中创建只接受对角鼠标移动的 MouseMotionListener?
【发布时间】:2016-03-17 21:36:21
【问题描述】:

我想在 Java 中创建一个实现 mouseDragged 方法的 MouseMotionListener,因此它只关心对角鼠标的移动。

我尝试通过保存旧的 X/Y 并将其与新的 X/Y 进行比较来计算鼠标位置的斜率,如下所示:

public void mouseDragged(MouseEvent e) {
    int deltaX = e.getX() - oldX;
    int deltaY = e.getY() - oldY;
    if (deltaX != 0) {
      int slope = deltaY / deltaX;
      if (slope == 1 || slope == -1) {
        draggedHookPoint.setDraggedPosition(e);
      }
    }
  }
  oldX = e.getX();
  oldY = e.getY();
}

我遇到的问题是 oldX 和 oldY 总是与新值相同。我想也许在方法结束时保存值会起作用。 我应该如何保存这些值?有更好的方法吗?

编辑:所以 oldX 和 oldY 并不总是相同的,我更改了代码以查找 slope == -1 || slope == 1 ,但问题是它仍然接受一些似乎不是对角线的鼠标时刻。

【问题讨论】:

  • 你愿意接受什么样的误差范围?鼠标不可能精确地垂直或水平移动而不在另一个方向上移动
  • @madprogrammer 可能.. 减 1。我只想将鼠标运动逻辑限制为在任何方向接近 45 度线时。
  • 尝试计算两点(新旧)之间的角度,这样会更容易

标签: java mouseevent motion


【解决方案1】:

我写了这段代码,基本上你在 JFrame 上画一条线,它会告诉你这条线是直的还是对角的。如果它是对角线,它将为​​您提供起点和终点之间的斜率。

public class Test extends JFrame implements MouseMotionListener, MouseListener {

public boolean diagonal;

public Point start;

public static void main(String[] args) throws IOException {
    JFrame j = new Test();
}

public Test() {
    setSize(600, 600);
    setVisible(true);
    addMouseMotionListener(this);
    addMouseListener(this);
}

@Override
public void mouseDragged(MouseEvent arg0) {
    if (start == null) {
        start = new Point(arg0.getX(), arg0.getY());
    }
}

@Override
    public void mouseReleased(MouseEvent arg0) {
        if (start != null) {
            if (start.x != arg0.getX() && start.y != arg0.getY()) {
                System.out.println("Diagonal");
                double slope = (arg0.getY()-start.y)/(arg0.getX()-start.getX());
                System.out.println("Slope is: " + slope);
            } else {
                System.out.println("Straight");
            }
            start = null;
        }

    }
@Override
public void mouseMoved(MouseEvent arg0) {
    // TODO Auto-generated method stub

}

@Override
public void mouseClicked(MouseEvent arg0) {
    // TODO Auto-generated method stub

}

@Override
public void mouseEntered(MouseEvent arg0) {
    // TODO Auto-generated method stub

}

@Override
public void mouseExited(MouseEvent arg0) {
    // TODO Auto-generated method stub

}

@Override
public void mousePressed(MouseEvent arg0) {
    // TODO Auto-generated method stub

}

}

【讨论】:

    猜你喜欢
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    相关资源
    最近更新 更多