使用Java中的Timer重置矩形位置

时间:2014-12-26 11:49:21

标签: java swing timer jframe jpanel

我正在尝试用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);
            }
        });
    }
}

请告诉我有关我的计划的结构。我需要对其进行一些更改吗?

3 个答案:

答案 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
        }
    });