java - 在 Java 中使用 Timer 重置矩形位置

标签 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);
            }
        });
    }
}

请让我知道我的程序的结构。我需要对其进行一些更改吗?

最佳答案

您必须像这样添加 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/

相关文章:

java - 在 JavaFX 任务中创建 JavaFX 对话框

java - 什么是NullPointerException,我该如何解决?

java - 我可以将 XInclude 与 Java 1.5 XML 属性一起使用吗?

java - Struts逻辑问题

java - GridBagLayout 中的错误可视化

java - 自定义 JDialog - 查明 K 是否被按下

java - 根据二维网格阵列上的单元格值查找路径

c# - 每 24 小时触发一次计时器回调 - DST 是否正确处理?

c - 定时器中断期间重新配置定时器 中断 8051

Sharepoint:从计时器作业执行 stsadm + SHAREPOINT\System 权限