简体   繁体   English

使用计时器重画

[英]Using timer to repaint

I have a maze where robots can move around and explore. 我有一个迷宫,机器人可以四处走动和探索。 I'm trying to use the timer to repaint as the robot move but timer's not kicking in for some reason. 我正在尝试使用计时器在机器人移动时进行重新绘制,但是由于某些原因计时器没有启动。 It's not delaying the program so I can't see the repainting process. 它没有延迟程序,所以我看不到重新绘制过程。 Here's my code: 这是我的代码:

public void updateDrawing(Maze maze) {  
    // 1000 millisecond delay
    Timer t = new Timer(1000, new TimerListener(maze));
    t.start();
}

private class TimerListener implements ActionListener {
    private Maze maze;

    public TimerListener(Maze maze) {
        super();
        this.maze = maze;
    }

    public void actionPerformed(ActionEvent e) {
        maze.repaint();
    }
}

public void explore (int id, Maze maze) {
    visited.add(maze.getCell(row, col));
    //Loop until we find the cavern 
    outerloop: //Label the outerloop for breaking purposes
    while(!foundCavern){
        //Move to a Cell
        Cell validCell = chooseValidCell(maze);
        //If validCell is null then we have to backtrack till it's not
        if(validCell == null){
            while(chooseValidCell(maze) == null){
                //Go back in route till we find a valid cell
                Cell lastCell = route.pollLast();
                if(lastCell == null){ //Implies we didn't find cavern, leave route empty
                    break outerloop;
                }
                this.row = lastCell.getRow();
                this.col = lastCell.getCol();
                updateDrawing(maze); // <- this calls repaint using timer
            }
            //Add back the current location to the route
            route.add(maze.getCell(row, col));
            validCell = chooseValidCell(maze);
        }
        this.row = validCell.getRow();
        this.col = validCell.getCol();
        updateDrawing(maze); // <- this calls repaint using timer
        //Add to the route 
        route.add(validCell);
        //Add to visited
        visited.add(validCell);
        //Check if we're at the cavern
        if(row == targetCavern.getRow() && col == targetCavern.getCol()){
            foundCavern = true;
        }
    }
}

Can anyone tell me why? 谁能告诉我为什么? Thank you! 谢谢!

try use not ** updateDrawing(maze)** but this method: 尝试不使用** updateDrawing(maze)**,而是使用以下方法:

void updateMaze() { void updateMaze(){

    EventQueue.invokeLater(()->updateDrawing(maze));
}

Here's how to make a basic timer. 这是制作基本计时器的方法。

All you need to do to calculate the time to display, is to record the time that the timer started: 计算显示时间所需要做的就是记录计时器启动的时间:

long startTime = System.currentTimeMillis();

Later, when you want to display the amount of time, you just subtract this from the current time. 以后,当您要显示时间量时,只需从当前时间中减去。

long elapsedTime = System.currentTimeMillis() - startTime;
long elapsedSeconds = elapsedTime / 1000;
long secondsDisplay = elapsedSeconds % 60;
long elapsedMinutes = elapsedSeconds / 60;
//put here code to format and display the values

You can make your program wait until elapsedSeconds == whatever value you want. 您可以让程序等到elapsedSeconds ==您想要的任何值。

From Make a simple timer in Java Java中的简单计时器开始

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM