我正在尝试用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);
}
});
}
}
请告诉我有关我的计划的结构。我需要对其进行一些更改吗?
答案 0 :(得分:1)
重置监听器也应该停止计时器!所以这部分动作执行了方法..
recx = 150; recy = 150;
应该更像是:
recx = 150; recy = 150;
timer.stop(); // stop the animation..
答案 1 :(得分:1)
你必须像这样添加repaint()方法:
JButton reset = new JButton("Reset");
reset.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
timer.stop();
recx = 150; recy = 150;
repaint();
}
});
另外,如其他答案中所述,您必须在重新绘制图形之前停止计时器。
Repaint()
:将更新您的图纸,因为更改值不足以更新用户在界面上看到的内容。
停止计时器:如果用户想要在启动计时器后重置图纸,矩形将返回其初始状态,但它将继续移动,这就是为什么在这种情况下停止计时器是必须的。
答案 2 :(得分:1)
问题是,为什么单击“重置”不起作用的是,此时UI不会重新绘制。
只需在监听器中添加repaint()
即可。
JButton reset = new JButton("Reset");
reset.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
recx = 150; recy = 150;
repaint(); //<--this one is needed
}
});