Java 将图像移动到光标在JFrame上单击的位置

Java 将图像移动到光标在JFrame上单击的位置,java,swing,Java,Swing,我需要一些关于Java类练习的帮助。我想做的是,当我点击JFrame的任何部分时,图像会更靠近指针。现在我已经完成了一部分,一旦我点击JFrame,图像和指针处于相同的位置,但它确实像是“传送”,我试图让它更像是一个指向指针位置的持续运动 到目前为止,这是我的代码我有自动取款机: import javax.swing.*; import java.awt.*; import java.awt.event.*; public class ControlaRaton extends MouseAd

我需要一些关于Java类练习的帮助。我想做的是,当我点击JFrame的任何部分时,图像会更靠近指针。现在我已经完成了一部分,一旦我点击JFrame,图像和指针处于相同的位置,但它确实像是“传送”,我试图让它更像是一个指向指针位置的持续运动

到目前为止,这是我的代码我有自动取款机:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class ControlaRaton extends MouseAdapter {
  JLabel label;

  public ControlaRaton(JLabel label){
    this.label = label;
  }

  public void mouseClicked(MouseEvent evt){
    Point pos = evt.getPoint();
    System.out.println(pos.x+" "+pos.y);
    //System.out.println("Boton: "+evt.getButton());
    label.setLocation(pos.x-20,pos.y-50);
  }
}

有没有办法这样做?我在考虑可能使用一个线程,但我不知道如何在这里实现它:s

在鼠标移动时重新绘制您的圆圈

    void mouseMoved(MouseEvent evt){
          Point pos = evt.getPoint();
System.out.println(pos.x+" "+pos.y);
//System.out.println("Boton: "+evt.getButton());
label.setLocation(pos.x-20,pos.y-50);
     }
});

鼠标移动时重新绘制圆

    void mouseMoved(MouseEvent evt){
          Point pos = evt.getPoint();
System.out.println(pos.x+" "+pos.y);
//System.out.println("Boton: "+evt.getButton());
label.setLocation(pos.x-20,pos.y-50);
     }
});

如果要在每次单击时稍微移动标签,可以执行以下操作:

public void mouseClicked(MouseEvent evt){
  Point clickedPos = evt.getPoint();
  Point newPosForLabel = calculateNewPos(clickedPos, labelPos);
  label.setLocation(newPosForLabel);
}

private Point calculateNewPos(Point clickedPos, Point labelPos) {
  // calculate newPos based on labelPos and clickedPos
  return newPos;
}

否则,请使用Hannes或MadProgrammer提供的计时器:

如果您想在每次单击时稍微移动标签,可以执行以下操作:

public void mouseClicked(MouseEvent evt){
  Point clickedPos = evt.getPoint();
  Point newPosForLabel = calculateNewPos(clickedPos, labelPos);
  label.setLocation(newPosForLabel);
}

private Point calculateNewPos(Point clickedPos, Point labelPos) {
  // calculate newPos based on labelPos and clickedPos
  return newPos;
}

否则,使用Hannes或MadProgrammer提供的计时器:

这是一种非常简单的方法,基本上所有这些都是使用Swing
计时器将实体移动到最后一个已知的点击点

看看

欲知详情

Swing不是线程安全的,在执行这些类型的操作时,必须考虑到这一点。Swing API提供了几种处理线程的方法,在本例中,我使用了一个简单的
计时器
,因为它以固定的时间间隔生成更新,并从EDT内部触发更新,从而可以安全地从内部更新UI

导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Point;
导入java.awt.RenderingHints;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入java.awt.geom.AffineTransform;
导入java.awt.image.buffereImage;
导入java.io.File;
导入java.io.IOException;
导入javax.imageio.imageio;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.Timer;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公共阶级走向{
公共静态void main(字符串[]args){
新动向();
}
公众运动{
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
例如printStackTrace();
}
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(新移动到span());
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
类向上移动扩展了JPanel{
私有最终缓冲图像;
专用点imagePosition=新点(150150);
专用点鼠标点;
专用双映像角度rad=0;
向……的公众运动{
BuffereImage i=null;
试一试{
i=ImageIO.read(getClass().getResource(“/sprite.png”);
}捕获(IOE异常){
e、 printStackTrace();
}
图像=i;
addMouseListener(新的MouseAdapter(){
@凌驾
公共无效mouseClicked(MouseEvent e){
mousePoint=e.getPoint();
double dx=e.getX()-imagePosition.getX();
double dy=e.getY()-imagePosition.getY();
imageAngleRad=Math.atan2(dy,dx);
重新油漆();
}
});
计时器计时器=新计时器(40,新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
if(鼠标点!=null){
int centerX=imagePosition.x+(image.getWidth()/2);
int centerY=imagePosition.y+(image.getHeight()/2);
if(mousePoint.x!=centerX){
imagePosition.x+=鼠标点.x
为什么不使用
JLabel
?由于很多原因,
JLabel
并不适合此任务,因为它需要考虑许多其他信息。本例还将精灵“转向”单击点,这是不容易实现的