在Java中,鼠标按下后不会激发MouseMoved

在Java中,鼠标按下后不会激发MouseMoved,java,swing,mouseevent,Java,Swing,Mouseevent,我正在尝试实现一种类似拖动的行为,允许用户画一条线 public void mousePressed(MouseEvent e) { int index = clickedBall(e.getX(),e.getY()); if(index!=-1){ MainWindow.inFocusBall = index; lx1 = TestPlay.balls.get(index).getX()+TestPlay.balls.get(index).get

我正在尝试实现一种类似拖动的行为,允许用户画一条线

public void mousePressed(MouseEvent e) {
    int index = clickedBall(e.getX(),e.getY());
    if(index!=-1){
        MainWindow.inFocusBall = index;
        lx1 = TestPlay.balls.get(index).getX()+TestPlay.balls.get(index).getRadius()/2;
        ly1 = TestPlay.balls.get(index).getY()+TestPlay.balls.get(index).getRadius()/2;
        System.out.println("Line Start:"+lx1+","+ly1);  
        BallProp.update();
    }
    isPressed = true;
    drawLine = true;
}

public void mouseMoved(MouseEvent e) {
    if(isPressed){
    System.out.println("MouseMoved");
    int index = MainWindow.inFocusBall;
    if(index!=-1){
        MainWindow.inFocusBall = index;
        lx1 = TestPlay.balls.get(index).getX()+TestPlay.balls.get(index).getRadius()/2;
        ly1 = TestPlay.balls.get(index).getY()+TestPlay.balls.get(index).getRadius()/2;
        BallProp.update();
    }
    lx2 = e.getX();
    ly2 = e.getY();
    repaint();
    }
}

public void mouseReleased(MouseEvent e) {
    isPressed = false;
    drawLine = false;
    System.out.println("MouseRelased");
    //TestPlay.balls.get(MainWindow.inFocusBall);
}
此代码的输出为MousePressed->MouseRelased

更多详细信息(如果您理解代码,请不要阅读)

这里的想法是,当鼠标被按下时,它会计算其是否被按下在图形对象(本例中为球)上,如果是,它会将索引(球数组中的索引)设置为被按下的球,它还会设置从圆心到其坐标绘制的线的起点

移动鼠标时,如果isPressed为true,则会将标志drawLine设置为true(绘制组件使用它来绘制线),线从球的中心绘制到当前鼠标位置,释放鼠标时,drawLine和isPressed设置为false

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    drawBalls(g);
    if(drawLine){
        g.setColor(Color.BLACK);
        g.drawLine(lx1, ly1, lx2, ly2);
    }
}

public void drawBalls(Graphics g){
    for(int x=0;x<TestPlay.balls.size();x++){
        g.setColor(TestPlay.balls.get(x).getColor());
        g.fillOval(TestPlay.balls.get(x).getX(), TestPlay.balls.get(x).getY(), TestPlay.balls.get(x).getRadius(), TestPlay.balls.get(x).getRadius());
    }
}
公共组件(图形g){
超级组件(g);
牵引杆(g);
if(抽绳){
g、 设置颜色(颜色为黑色);
g、 抽绳(lx1、ly1、lx2、ly2);
}
}
公用空心牵引杆(图g){

对于(int x=0;x您应该尝试实现mouseDragged():


你能实现mouseDragged()事件吗?当你在组件中单击并拖动时会触发该事件。我尝试了这种方法,但它在程序中导致了一个错误。但有一个问题,鼠标按下和鼠标释放是否在mouseDragged()之前和之后触发?是的。为什么你不能实现mouseDragged()?导致mousedpressed()呢在那之前不会被炒鱿鱼。
public void mouseDragged(MouseEvent e) {
    System.out.println("mouseDragged: " + e.getX() + " , " + e.getY());

}