在延迟的循环中重新绘制JPanel

时间:2011-02-07 01:06:03

标签: java swing sorting jpanel repaint

我正在尝试创建一个程序,通过在每次排序循环时绘制一组表示数组的条形图来可视化不同的排序算法。但是,当我从分类器类中设置数组时,它又重新绘制了面板,似乎它只调用paintComponent()进行第一次和最后一次迭代,而不是显示两者之间的步骤。

以下是调用setNumberArray()方法的排序代码:

public void bubbleSort() {
    int[] x = getNumberArray();
    boolean doMore = true;
    while (doMore) {
        doMore = false;
        for (int count = 0; count < x.length - 1; count++) {
            if (x[count] > x[count+1]) {
               int temp = x[count];  x[count] = x[count+1];  x[count+1] = temp;
               doMore = true;
            }
        }
        // Update the array
        SorterGUI.getSorterPanel().setNumberArray(x);
        // Pause
        try {
            Thread.sleep(500);
        } catch (InterruptedException ex) {
            Logger.getLogger(Sorter.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

哪个电话:

public void setNumberArray(int[] numberArray) {
    this.numberArray = numberArray;
    repaint();
}

最后绘制条形图:

protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    int length = numberArray.length;
    Graphics2D g2d = (Graphics2D) g;

    g2d.setColor(Color.white);
    g2d.fillRect(0, 0, getWidth(), getHeight());

    g2d.setColor(Color.gray);
    for(int count = 0; count < length; count++) {
        g2d.fill3DRect((getWidth() / length) * (count + 1), 0, 
               getWidth() / length, getHeight() - (numberArray[count] * 3), 
               true);
        playSound(numberArray[count]);
    }
    System.out.print(".");
}

我知道它之间没有重新绘制(有或没有延迟)因为它只打印一个“。”当我开始排序时。

2 个答案:

答案 0 :(得分:2)

暂时忘掉画面,因为这不会解决你的问题。问题是你在EDT上调用Thread.sleep,这是主要的Swing线程,称为事件调度线程,这将使你的Swing应用程序进入休眠状态(正如你所发现的那样)。而是使用Swing Timer来延迟,所有这些都可以正常工作。要么在后台线程中执行,要么执行Thread.sleep。

答案 1 :(得分:1)

您可以使用JComponent.paintImmediately强制立即绘画