如何使用java定时器,它在我的程序中不起作用

如何使用java定时器,它在我的程序中不起作用,java,swing,timer,graphics2d,Java,Swing,Timer,Graphics2d,这个方法用来画机器人&我想每1秒画一个接一个的机器人,并有一个延迟(不是一次画所有的机器人)。我用了定时器,但不工作,所以如何在我的例子中使用它, 机器人代表矩形并向目标移动 public void paint(double[] position, double direction, int[][] pixels, double robotHalfDiagonalDistance) { double[] corner1, corner2, corner3, corner4;

这个方法用来画机器人&我想每1秒画一个接一个的机器人,并有一个延迟(不是一次画所有的机器人)。我用了定时器,但不工作,所以如何在我的例子中使用它, 机器人代表矩形并向目标移动

public void paint(double[] position, double direction, int[][] pixels, double robotHalfDiagonalDistance) {
        double[] corner1, corner2, corner3, corner4;
        final Graphics2D g = (Graphics2D) image.getGraphics();
          super.paint(g);
        corner1 = new double[2]; corner2 = new double[2];corner3 = new double[2]; corner4 = new double[2];
        corner1[0] = (position[0] + robotHalfDiagonalDistance * Math.sin(direction - pi / 4));
        corner1[1] = (position[1] + robotHalfDiagonalDistance * Math.cos(direction - pi / 4));
        corner2[0] = (position[0] + robotHalfDiagonalDistance * Math.sin(direction + pi / 4));
        corner2[1] = (position[1] + robotHalfDiagonalDistance * Math.cos(direction + pi / 4));
        corner3[0] = (position[0] + robotHalfDiagonalDistance * Math.sin(direction - pi / 4 + pi));
        corner3[1] = (position[1] + robotHalfDiagonalDistance * Math.cos(direction - pi / 4 + pi));
        corner4[0] = (position[0] + robotHalfDiagonalDistance * Math.sin(direction + pi / 4 + pi));
        corner4[1] = (position[1] + robotHalfDiagonalDistance * Math.cos(direction + pi / 4 + pi));

        int value0 = (int) corner1[0];int value1 = (int) corner1[1];
        final int[] corner1n = {value0, value1};
        int value00 = (int) corner2[0]; int value11 = (int) corner2[1];
        final int[] corner2n = {value00, value11};
        int value000 = (int) corner3[0];int value111 = (int) corner3[1];
        final int[] corner3n = {value000, value111};
        int value0000 = (int) corner4[0];int value1111 = (int) corner4[1];
        final int[] corner4n = {value0000, value1111};

        if (pixels[corner1n[0]][corner1n[1]] == 1 && pixels[corner2n[0]][corner2n[1]] == 1 && pixels[corner3n[0]][corner3n[1]] == 1
                && pixels[corner4n[0]][corner4n[1]] == 1) {

            g.setColor(Color.RED);
            //g.setStroke(new BasicStroke(2));

            Timer t = new Timer(1000,new ActionListener(){
                @Override
                public void actionPerformed(ActionEvent e) {
                    //bottom
                    g.drawLine(corner1n[0], corner1n[1], corner2n[0], corner2n[1]);
                    //right
                    g.drawLine(corner2n[0], corner2n[1], corner3n[0], corner3n[1]);
                    //up
                    g.drawLine(corner3n[0], corner3n[1], corner4n[0], corner4n[1]);
                    ///left
                    g.drawLine(corner4n[0], corner4n[1], corner1n[0], corner1n[1]);
                    //repaint();
            }
        });
            t.start();
                       }

         else{
             System.err.println("collision ");
         }
   }

请帮助我

首先,您需要创建指定的任务(绘图),然后安排重复固定速率执行延迟:

import javax.swing.Timer;

int delay = 1000; //milliseconds
ActionListener taskPerformer = new ActionListener() {
  public void actionPerformed(ActionEvent evt) {
      // Perform a task repeatedly
  }
};
new Timer(delay, taskPerformer).start();
一旦计时器启动,它将等待初始延迟,然后向注册的侦听器触发其第一个ActionEvent
有关该主题的进一步阅读,请查看上面的链接。

您是否查看了给定链接以获取完整示例?也许你做错了什么。这是另一个有用的。只是当在主显示scheduleAtFixedRate中使用计时器时,但我需要在method not in main中使用它可能会有所帮助。@AndrewThompson我不知道它的存在,谢谢。下面是一个关于如何使用时间移动对象和重新绘制的示例。