如何制作小程序动画?

问题描述:

我尝试制作包含插入/删除/搜索操作的数组的小程序。对于插入和删除,很容易:一旦用户点击'插入'或'删除'按钮,只需更新数组,然后调用repaint重绘数组。
然而,搜索是不同的,这是一个动画,一旦搜索按钮被点击,我想从数组中的第一个元素开始,通过高亮检查该元素的值。我有如下的代码,但它只在最后一步高亮元素(当元素被找到时),它不会高​​亮显示每个元素,因为我不是很熟悉小程序动画,任何人都可以帮帮我?谢谢。如何制作小程序动画?

// index for search. 
private searchIndex = -1; 

public boolean search(int number) { 
    boolean found = false; 

    for (int i = 0; i < arr.getSize(); i++) { 
    searchIndex = i; 

    repaint(); 
    revalidate(); 

    if (arr.getElement(i) == number) { 
    found = true; 
    break; 
    } 

    try { 
    Thread.sleep(3000); 
    } catch (InterruptedException e) { 
    e.printStackTrace(); 
    } 
    } 

    return found; 
} 

    public void paintComponent(Graphics g) { 

     super.paintComponent(g);  
     Graphics2D g2; 
     g2 = (Graphics2D) g; 
     g2.setRenderingHint(
       RenderingHints.KEY_ANTIALIASING, 
       RenderingHints.VALUE_ANTIALIAS_ON); 

     int xPos = START_X, yPos = START_Y; 
     int width = CELL_WIDTH, height = CELL_HEIGHT; 

     Font font = new Font("Serif", Font.BOLD, 12); 
     g2.setFont(font); 

     // draw array 
     for(int i = 0; i < arr.getSize(); i++) { 
int element = arr.getElement(i); 

g2.setColor(Color.BLUE); 
g2.drawString(Integer.toString(element), xPos + OFFSET - 5, yPos + OFFSET + 5); 

g2.setColor(Color.BLACK); 
g2.drawRect(xPos, yPos, width, height); 

xPos += width; 
     } 

     // high light the cell 
     if (searchIndex > -1) { 
    xPos = START_X + (runSearch * CELL_WIDTH); 

    g2.setColor(Color.blue); 
    g2.fillRect(xPos, yPos, width, height); 

    g2.setColor(Color.white); 
    g2.drawString(Integer.toString(arr.getElement(searchIndex)), xPos + OFFSET - 5, yPos + OFFSET + 5); 
} 

    } 

因为Thread.sleep()导致EDT进入睡眠状态,这意味着GUI直到循环结束时才能重新绘制自己。相反,你应该使用Swing Timer来安排动画。

阅读Swing tutorial。从“并发”部分开始(了解EDT的工作原理)和“如何使用计时器”。