Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Java中的定时器重置矩形位置_Java_Swing_Timer_Jframe_Jpanel - Fatal编程技术网

用Java中的定时器重置矩形位置

用Java中的定时器重置矩形位置,java,swing,timer,jframe,jpanel,Java,Swing,Timer,Jframe,Jpanel,我正在用Java对计时器动画进行一个小测试。其中有三个按钮和一个矩形。按钮是开始停止重置。单击“开始”按钮时,矩形将设置动画;单击“停止”按钮时,矩形将停止设置动画;单击“重置”按钮时,矩形将返回到原始位置,只有单击“开始”按钮时,矩形才应重新设置动画。前两个按钮有效!但问题出在重置按钮上。这是我的密码,请告诉我哪里出错了 package projectretrytest; import javax.swing.*; import java.awt.*; import java.awt.eve

我正在用Java对
计时器
动画进行一个小测试。其中有三个按钮和一个矩形。按钮是
开始
停止
重置
。单击“开始”按钮时,矩形将设置动画;单击“停止”按钮时,矩形将停止设置动画;单击“重置”按钮时,矩形将返回到原始位置,只有单击“开始”按钮时,矩形才应重新设置动画。前两个按钮有效!但问题出在
重置
按钮上。这是我的密码,请告诉我哪里出错了

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

请让我知道我的课程结构。我需要对它做一些更改吗?

重置侦听器也应该停止计时器!所以这部分的动作执行方法

recx = 150; recy = 150;
应该更像:

recx = 150; recy = 150;
timer.stop(); // stop the animation..
必须像下面这样添加repaint()方法:

 JButton reset = new JButton("Reset");
        reset.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                timer.stop();
                recx = 150; recy = 150;
                repaint();
            }
        });
另一个答案中提到,在重新绘制图形之前,必须停止计时器。

Repaint()
:将更新图形,因为更改值不足以更新用户在界面上实际看到的内容


停止计时器:如果用户想在启动计时器后重置图形,矩形将返回到其初始状态,但它将继续移动,这就是为什么在这种情况下必须停止计时器。

问题是,单击“重置”不起作用的原因是此时未重新绘制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
        }
    });
JButton reset=新的JButton(“reset”);
reset.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
recx=150;recy=150;
重新油漆()//