繁体   English   中英

Java中方法执行的延迟

[英]Delay of methods execution in Java

我在for循环中执行方法时遇到问题。 我希望我的程序执行5次programmedMoving()方法。

programmedMoving()方法包含两个方法:

第一个( chooseTheDirection() )执行某种算法并返回对象应向其移动的Point2D

第二个( moveToThePoint() )应该得到这一点并移动对象。

public boolean dispatchKeyEvent(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_H) {
            for(int i=0; i<5; i++{
               programmedMoving();
            }
        }
}

//////////////////////////////////////////////////////////////////

private void programmedMoving(){
        chooseTheDirection();  //returns the Point2D
        moveToThePoint();//according to the direction starts moving the point
    }

问题在于它执行了5次chooseTheDirection()方法,而没有等待moveToThePoint()方法完成其执行。 因此,当JPanel上的对象开始实际移动时, chooseTheDirection()方法已经提供了5个Point2D点,而我只需要提供一个点,并等待下一个方法的结束。

谁能告诉我我在做什么错? 谢谢。

在此处输入图片说明

另外:

private Direction chooseDirection(){
    final List<Direction> directionList = Collections.unmodifiableList(Arrays.asList(Direction.values()));

    int pick = random.nextInt(directionList.size());
    dir = directionList.get(pick);
    directionsArchive.add(dir);
    System.out.println("dir " + dir + " " + directionsArchive);
    if(directionsArchive.size() == 1){
        dir = directionsArchive.get(0);
        System.out.println("equal to one taken " + dir + " size of dir " + directionsArchive.size());
        directionsArchive.add(dir);
    }
    if(directionsArchive.size() > 1){
        int last = directionsArchive.size()-1;
        System.out.println("index of last " + last);
        if(directionsArchive.get(last).equals(dir)){
            pick = random.nextInt(directionList.size());
            dir = directionList.get(pick);
            directionsArchive.add(dir);
        }
        System.out.println("more than one taken " + dir + " size of dir " + directionsArchive.size());
        directionsArchive.add(dir);
    }
    else{
    directionsArchive.add(dir);
    System.out.println(" size of dir " + directionsArchive.size());}
    return dir;
}


private void moveToThePoint(){
    if(dir.equals(Direction.NORTH)){
        this.robot.turnUp();
        this.robot.go();
    }
    if(dir.equals(Direction.SOUTH)){
        this.robot.turnDown();
        this.robot.go();            
    }
    if(dir.equals(Direction.EAST)){
        this.robot.turnRight();
        this.robot.go();
    }
    if(dir.equals(Direction.WEST)){
        this.robot.turnLeft();
        this.robot.go();
    }
}

// SOME EXAMPLES TO THE MOVING METHODS. I PROVIDED ONLY ONE, CAUSE THEY ARE PRETTY SIMILAR
    public void turnDown()
    {
        //System.out.println("Robot - Turn Down!");
        this.m_nXDir = 0;
        this.m_nYDir = 1;
    }

    public void go()
    {
        this.m_nStep = 1;
        //System.out.println("Robot - Go!");
    }

public void move(int d, int e)
{
    //from start to finish
    int x = d + this.m_nStep * this.m_nXDir;
    int y = e + this.m_nStep * this.m_nYDir;

    int w = getWidth();
    int h = getHeight();

    setBounds(x, y, w, h);
}

moveToThePoint实际上并不移动对象,它只是将步长设置为1。我假设实际的move()函数是在计时器上调用的。

这里有2条有关如何修复它的建议:

为每个步骤重新运行决策算法( programmedMoving )。

要么

排队未来的动作。 您为该对象存储一个将来移动的队列,并且每次计划move()move()都会从队列中删除下一个移动并执行它。

暂无
暂无

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

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