2016-12-12 1 views
1

Я понимаю, что функция repaint() не мгновенно перерисовывает рамку. Тем не менее, метод repaint здесь вызывается во время рекурсивной функции и только реплицируется после завершения функции towerOfHanoi. Есть ли возможность мгновенно вызвать функцию рисования для перерисовки каждый раз во время итерации рекурсивной функции?Как перекрасить, как только функция repaint() вызывается в апплете?

public void actionPerformed(ActionEvent e) { 
    if (e.getSource() == start) { 
     num = number.getText().trim(); 
     numDisks = Integer.parseInt(num); 

     //start the tower of hanoi function catch block used because of the delay function 
     repaint(); 

     height[0].changeHeight(numDisks); 
     begin = true; 
     towerOfHanoi(numDisks, 0, 2, 1); 
     //repaint(); 
    } 

} 


//initialize the pegs; first thing called when applet starts 
public void paint(Graphics g) { 
    g.setColor(Color.BLUE); 
    g.fillRect(20, 190, 560, 10); //base 
    g.fillRect(70, 60, 10, 150); //first peg 
    g.fillRect(300, 60, 10, 150); //second peg 
    g.fillRect(530, 60, 10, 150); //third peg 

    //create the painting based on the amount of disks, starting with the biggest disk. 
    //when this is repainted, it will draw the new disks in different pegs with different coordinates 
    g.setColor(Color.RED); 
    for (int i = 0; i < numDisks; i++) { 
     g.fillRect(disks[i].xPos, disks[i].yPos, disks[i].width, 10); 
    } 
} 

public void update(Graphics g) { 
    paint(g); 
} 


public void towerOfHanoi(int N, int from, int to, int temp) { 

    if (N == 1) { 
     moveTo(from, to, N); 
    } 
    else { 
     towerOfHanoi(N - 1, from, temp, to); 
     moveTo(from, to, N); 
     towerOfHanoi(N - 1, temp, to, from); 
    } 
} 

//change move to function move disks from 1st stack to the 3rd stack 
public void moveTo(int from, int to, int diskNum) {   
    System.out.println(from + "->" + to); 

    //adjust the disk number to match the indexing of the way I 
    //used the disk number, as an index of arrays starting from 
    //the bottom up at 0. 
    if (numDisks == 1) { 
     if (diskNum == 1) { diskNum = 0;} 
    } 
    else if (numDisks == 2) { 
     if (diskNum == 1) {diskNum = 1; } 
     else if (diskNum == 2) {diskNum = 0; } 
    } 
    else if (numDisks == 3) { 
     if (diskNum == 1) { diskNum = 2;} 
     else if (diskNum == 2) {diskNum = 1;} 
     else if (diskNum == 3) {diskNum = 0;} 
    } 
    else if (numDisks == 4) { 
     if (diskNum == 1) { diskNum = 3;} 
     else if (diskNum == 2) {diskNum = 2;} 
     else if (diskNum == 3) {diskNum = 1;} 
     else if (diskNum == 4) {diskNum = 0;} 
    } 
    else if (numDisks == 5) { 
     if (diskNum == 1) { diskNum = 4;} 
     else if (diskNum == 2) {diskNum = 3;} 
     else if (diskNum == 3) {diskNum = 2;} 
     else if (diskNum == 4) {diskNum = 1;} 
     else if (diskNum == 5) {diskNum = 0;} 
    } 
    else if (numDisks == 6) { 
     if (diskNum == 1) { diskNum = 5;} 
     else if (diskNum == 2) {diskNum = 4;} 
     else if (diskNum == 3) {diskNum = 3;} 
     else if (diskNum == 4) {diskNum = 2;} 
     else if (diskNum == 5) {diskNum = 1;} 
     else if (diskNum == 6) {diskNum = 0;} 
    } 
    else if (numDisks == 7) { 
     if (diskNum == 1) { diskNum = 6;} 
     else if (diskNum == 2) {diskNum = 5;} 
     else if (diskNum == 3) {diskNum = 4;} 
     else if (diskNum == 4) {diskNum = 3;} 
     else if (diskNum == 5) {diskNum = 2;} 
     else if (diskNum == 6) {diskNum = 1;} 
     else if (diskNum == 7) {diskNum = 0;} 
    } 


    //diskNum += height[from].height; 
    System.out.println("Disk moving is disk # " + diskNum); 
    topDisk = diskNum; 

    height[from].pop(); 
    height[to].push(); 

    System.out.println("Height of Peg 1: " + height[0].height); 
    System.out.println("Height of Peg 2: " + height[1].height); 
    System.out.println("Height of Peg 3: " + height[2].height); 
    /* we can do this the hard way and calculate the xPos and yPos 
    * We might just have to create the disk1 - disk7 each with its own widths, every disk 
    * has the same height. Every disk has its own xPos and yPos. 
    * when we do that, we will then need to calculate the appropriate xPos for each.. 
    * but how do we calculate the yPos????? 
    * yPos is calculated based on the height of the pegs... 
    * So now how do we calculate what the top disk number is? 
    * 
    */ 


    if (from == 0 && to == 1) { //adjust the new xPos 
     disks[topDisk].from0to1(); //change xPos 
     if (height[1].height == 0) { //adjusts the new yPos 
      disks[topDisk].yPos = 175; 
     } else if (height[1].height == 1) { 
      disks[topDisk].yPos = 165; 
     } else if (height[1].height == 2) { 
      disks[topDisk].yPos = 155; 
     } else if (height[1].height == 3) { 
      disks[topDisk].yPos = 145; 
     } else if (height[1].height == 4) { 
      disks[topDisk].yPos = 135; 
     } else if (height[1].height == 5) { 
      disks[topDisk].yPos = 125; 
     } else if (height[1].height == 6) { 
      disks[topDisk].yPos = 115; 
     } else if (height[1].height == 7) { 
      disks[topDisk].yPos = 105; 
     } 
    } else if (from == 1 && to == 2) { 
     disks[topDisk].from1to2(); 
     if (height[2].height == 0) { //adjusts the new yPos 
      disks[topDisk].yPos = 175; 
     } else if (height[2].height == 1) { 
      disks[topDisk].yPos = 165; 
     } else if (height[2].height == 2) { 
      disks[topDisk].yPos = 155; 
     } else if (height[2].height == 3) { 
      disks[topDisk].yPos = 145; 
     } else if (height[2].height == 4) { 
      disks[topDisk].yPos = 135; 
     } else if (height[2].height == 5) { 
      disks[topDisk].yPos = 125; 
     } else if (height[2].height == 6) { 
      disks[topDisk].yPos = 115; 
     } else if (height[2].height == 7) { 
      disks[topDisk].yPos = 105; 
     } 
    } else if (from == 0 && to == 2) { 
     disks[topDisk].from0to2(); 
     if (height[2].height == 0) { //adjusts the new yPos 
      disks[topDisk].yPos = 175; 
     } else if (height[2].height == 1) { 
      disks[topDisk].yPos = 165; 
     } else if (height[2].height == 2) { 
      disks[topDisk].yPos = 155; 
     } else if (height[2].height == 3) { 
      disks[topDisk].yPos = 145; 
     } else if (height[2].height == 4) { 
      disks[topDisk].yPos = 135; 
     } else if (height[2].height == 5) { 
      disks[topDisk].yPos = 125; 
     } else if (height[2].height == 6) { 
      disks[topDisk].yPos = 115; 
     } else if (height[2].height == 7) { 
      disks[topDisk].yPos = 105; 
     } 
    } else if (from == 1 && to == 0) { 
     disks[topDisk].from1to0(); 
     if (height[0].height == 0) { //adjusts the new yPos 
      disks[topDisk].yPos = 175; 
     } else if (height[0].height == 1) { 
      disks[topDisk].yPos = 165; 
     } else if (height[0].height == 2) { 
      disks[topDisk].yPos = 155; 
     } else if (height[0].height == 3) { 
      disks[topDisk].yPos = 145; 
     } else if (height[0].height == 4) { 
      disks[topDisk].yPos = 135; 
     } else if (height[0].height == 5) { 
      disks[topDisk].yPos = 125; 
     } else if (height[0].height == 6) { 
      disks[topDisk].yPos = 115; 
     } else if (height[0].height == 7) { 
      disks[topDisk].yPos = 105; 
     } 
    } else if (from == 2 && to == 0) { 
     disks[topDisk].from2to0(); 
     if (height[0].height == 0) { //adjusts the new yPos 
      disks[topDisk].yPos = 175; 
     } else if (height[0].height == 1) { 
      disks[topDisk].yPos = 165; 
     } else if (height[0].height == 2) { 
      disks[topDisk].yPos = 155; 
     } else if (height[0].height == 3) { 
      disks[topDisk].yPos = 145; 
     } else if (height[0].height == 4) { 
      disks[topDisk].yPos = 135; 
     } else if (height[0].height == 5) { 
      disks[topDisk].yPos = 125; 
     } else if (height[0].height == 6) { 
      disks[topDisk].yPos = 115; 
     } else if (height[0].height == 7) { 
      disks[topDisk].yPos = 105; 
     } 
    } else if (from == 2 && to == 1) { 
     disks[topDisk].from2to1(); 
     if (height[1].height == 0) { //adjusts the new yPos 
      disks[topDisk].yPos = 175; 
     } else if (height[1].height == 1) { 
      disks[topDisk].yPos = 165; 
     } else if (height[1].height == 2) { 
      disks[topDisk].yPos = 155; 
     } else if (height[1].height == 3) { 
      disks[topDisk].yPos = 145; 
     } else if (height[1].height == 4) { 
      disks[topDisk].yPos = 135; 
     } else if (height[1].height == 5) { 
      disks[topDisk].yPos = 125; 
     } else if (height[1].height == 6) { 
      disks[topDisk].yPos = 115; 
     } else if (height[1].height == 7) { 
      disks[topDisk].yPos = 105; 
     } 
    } 
    try { 
     Thread.sleep(50); 
    } catch(Exception ex) { 

    } 
    repaint(); 
} 

ответ

0

repaint() посылает команду перерисовки экрана после того, как поток пользовательского интерфейса становится доступным. Если вы еще этого не сделали, я бы предложил сделать все ваши преобразования в другом потоке, тогда repaint() будет обновлять экран относительно быстро (поскольку поток пользовательского интерфейса ничего не делает).

Смежные вопросы