我正在尝试对 Java 中的 Timer
动画进行小测试。那里有三个按钮和一个矩形。按钮是 START
STOP
RESET
。单击开始按钮时,矩形动画,单击停止时,矩形停止动画,单击重置按钮时,矩形应返回到原始位置,只有单击开始时,它才应再次开始动画。前两个按钮有效!但问题出在 RESET
按钮上。这是我的代码,请指导我哪里出错了。
package projectretrytest;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ProjectRetryTest extends JPanel {
private static final int D_HEIGHT = 500;
private static final int D_WIDTH = 400;
private static final int INCREMENT = 8;
int recx = 150,recy = 150;
private Timer timer = null;
public ProjectRetryTest() {
timer = new Timer(30, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
update();
repaint();
}
});
JButton start = new JButton("Start");
start.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
timer.start();
}
});
JButton stop = new JButton("Stop");
stop.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
timer.stop();
}
});
JButton reset = new JButton("Reset");
reset.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
recx = 150; recy = 150;
}
});
JPanel panel = new JPanel();
panel.add(start);
panel.add(stop);
panel.add(reset);
setBackground(Color.blue);
setLayout(new BorderLayout());
add(panel, BorderLayout.PAGE_START);
}
public void update()
{
recx++;
recy--;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawRect(recx,recy,20,20);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(D_WIDTH, D_HEIGHT);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame frame = new JFrame();
frame.add(new ProjectRetryTest());
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
请让我知道我的程序的结构。我需要对其进行一些更改吗?
最佳答案
您必须像这样添加 repaint() 方法:
JButton reset = new JButton("Reset");
reset.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
timer.stop();
recx = 150; recy = 150;
repaint();
}
});
另外如其他答案所述,您必须在重新绘制图形之前停止计时器。
Repaint()
:将更新您的绘图,因为更改值不足以更新用户在界面上实际看到的内容。
停止计时器:如果用户想在启动计时器后重置绘图,矩形将回到其初始状态但它会继续移动,这就是为什么在这种情况下必须停止计时器的原因。
关于java - 在 Java 中使用 Timer 重置矩形位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27656732/