所以我有这个人:
我们叫他鲍勃。
我想让他朝我的鼠标位置旋转。我已经想通过在Bob和鼠标之间画一条线并找到这条线的角度,我可以找出角度是什么,Bob需要面对以便“指向”鼠标。但是我仍然不知道如何完成这项任务。
提前致谢!
答案 0 :(得分:0)
您不应将图片包含在JLabel
中。它根本没有提供太大的灵活性。定位可能是奇数,您无法绘制旋转的图像。 (你只能创建一个旋转的图像并将其放入标签中,但这样效率会很低,而且尺寸和位置问题会让你发疯)。
相反,您应该在paintComponent
的重写JPanel
方法中手动绘制图像。还有一些细节需要考虑。例如,图像应该具有某个位置,并且位置应该可以引用图像的 center - 即,指出它将会旋转。
但是,当您计算出图像中心和鼠标位置之间的直线角度时,您可以通过
简单地绘制具有所需方向的图像。这是MCVE:
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class ImageFollowingMouseTest
{
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
createAndShowGUI();
}
});
}
private static void createAndShowGUI()
{
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(new ImageFollowingMousePanel());
f.setSize(400,400);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}
class ImageFollowingMousePanel extends JPanel implements MouseMotionListener
{
private final BufferedImage image;
private Point imagePosition = new Point(150,150);
private double imageAngleRad = 0;
public ImageFollowingMousePanel()
{
BufferedImage i = null;
try
{
i = ImageIO.read(new File("6Wu0b.png"));
}
catch (IOException e)
{
e.printStackTrace();
}
image = i;
addMouseMotionListener(this);
}
protected void paintComponent(Graphics gr)
{
super.paintComponent(gr);
Graphics2D g = (Graphics2D)gr;
g.setRenderingHint(
RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
int cx = image.getWidth() / 2;
int cy = image.getHeight() / 2;
AffineTransform oldAT = g.getTransform();
g.translate(cx+imagePosition.x, cy+imagePosition.y);
g.rotate(imageAngleRad);
g.translate(-cx, -cy);
g.drawImage(image, 0, 0, null);
g.setTransform(oldAT);
}
@Override
public void mouseDragged(MouseEvent e)
{
}
@Override
public void mouseMoved(MouseEvent e)
{
double dx = e.getX() - imagePosition.getX();
double dy = e.getY() - imagePosition.getY();
imageAngleRad = Math.atan2(dy, dx);
repaint();
}
}