[英]How to make a shape move to click in JPanel?
我试图使形状移动到我单击鼠标的位置。 我得到了移动的形状,它朝着我单击的位置的大致方向移动,但是它永远不会精确地移动到我单击的位置,因此错过了一段很长的距离。 由于它不会完全移动到我单击的位置,因此形状会继续移动并且不会停止。
这是代码:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.IOException;
public class GraphicsTester extends JFrame implements MouseListener {
private int startX;
private int startY;
private int endX;
private int endY;
private int stepX;
private int stepY;
private Timer sliderTimer = new Timer(40, new SlideListener());
public GraphicsTester() throws IOException {
setTitle("Graphics Tester 1");
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
JPanel basePanel = new JPanel(new BorderLayout()) {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(Color.red);
g2d.fillOval(215 + stepX, 215 + stepY, 30, 30);
startX = stepX;
startY = stepY;
if (215 + stepX == endX && 215 + stepY == endY) {
sliderTimer.stop();
}
}
};
basePanel.setPreferredSize(new Dimension(500, 500));
basePanel.addMouseListener(this);
getContentPane().add(basePanel);
pack();
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
new GraphicsTester();
} catch (IOException ex) {
ex.printStackTrace();
}
}
});
}
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
endX = e.getX();
endY = e.getY();
System.out.println("endX: " + endX + ", endY: " + endY);
sliderTimer.start();
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
private class SlideListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
stepX += (endX - startX) / 5; // the 5's are just arbitrary values, I chose 5 because it makes the shape slide at the speed I want
stepY += (endY - startY) / 5;
System.out.println("stepX: " + (215 + stepX) + ", stepY: " + (215 + stepY));
repaint();
}
}
}
如何使形状精确移动到单击的位置? 问题在于stepX += (endX - startX) / 5;
和stepY += (endY - startY) / 5;
。 这两行导致形状不能精确移动到我单击的位置,因为它们没有将stepX
和stepY
精确地增加到单击位置,而是每次增加一个“舍入”。 我不知道如何固定这两行,以便它们将stepX
和stepY
精确地增加到我单击的位置,因此一旦到达endX
和endY
,就停止移动形状。
您的主要问题是您在paintComponent()
方法中的stepX
和stepY
中添加了215
,这就是为什么它看起来“ stepY
”的原因。 这是因为当您确实要在stepX
和stepY
(它们都是基于单击时的鼠标指针)上绘制时,它在stepX + 215
和stepY + 215
绘制。 大概+ 215
只是初始位置的偏移量?
简单的解决方法是将您的paintComponent()
方法更改为:
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(Color.RED);
g2d.fillOval(stepX, stepY, 30, 30);
startX = stepX;
startY = stepY;
if (stepX == endX && stepY == endY) {
sliderTimer.stop();
}
}
或仅与所有坐标的偏移量一致。
其次,您的slideTimer.stop()
极不可能被调用。 如果满足以下条件,则应设置stepX = endX
和stepY = endY
: end - step < 5
,即
stepX = endX - startX < 5 ? endX : stepX + (endX - startX) / 5;
stepY = endY - startY < 5 ? endY : stepY + (endY - startY) / 5;
这可能无法达到最佳效果,所以请随时尝试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.