[英]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.