如何使形状移动以在 JPanel 中单击?
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
到点击,而是每次增加 "round"。我不知道如何修复这两条线,以便它们将 stepX
和 stepY
精确地递增到我单击的位置,因此一旦达到 endX
和 [=18= 就停止移动形状].
您的主要问题是您在 paintComponent()
方法中将 215
添加到 stepX
和 stepY
,这就是为什么它看起来是 'way off' .这是因为它绘制在 stepX + 215
和 stepY + 215
,而您确实希望它恰好绘制在 stepX
和 stepY
(基于单击时的鼠标指针) ).大概 + 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;
这可能无法使其达到最佳效果,所以请随意尝试。
我正在尝试使形状移动到我单击鼠标的任何位置。我得到了要移动的形状,它朝着我点击的大致方向移动,但它从来没有完全移动到我点击的位置,它错过了很远的距离。由于它没有准确移动到我单击的位置,因此形状继续移动并且不会停止。
代码如下:
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
到点击,而是每次增加 "round"。我不知道如何修复这两条线,以便它们将 stepX
和 stepY
精确地递增到我单击的位置,因此一旦达到 endX
和 [=18= 就停止移动形状].
您的主要问题是您在 paintComponent()
方法中将 215
添加到 stepX
和 stepY
,这就是为什么它看起来是 'way off' .这是因为它绘制在 stepX + 215
和 stepY + 215
,而您确实希望它恰好绘制在 stepX
和 stepY
(基于单击时的鼠标指针) ).大概 + 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;
这可能无法使其达到最佳效果,所以请随意尝试。