Перекрашивание JPanel в цикле с задержкой - PullRequest
2 голосов
/ 07 февраля 2011

Я пытаюсь создать программу, которая будет визуализировать различные алгоритмы сортировки, рисуя набор столбцов, представляющих массив для каждого цикла сортировки.Однако, когда я устанавливаю массив из класса сортировщика, который, в свою очередь, перекрашивает панель, кажется, что он вызывает только 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 ]

2 голосов
/ 07 февраля 2011

Немедленно забудьте о краске, так как это не решит вашу проблему.Проблема в том, что вы вызываете Thread.sleep в EDT, главном потоке Swing, известном как поток рассылки событий, и это переводит ваше приложение Swing в спящий режим (как вы узнали).Вместо этого используйте таймер Swing для вашей задержки, и все будет работать хорошо.Либо так, либо делайте свой Thread.sleep в фоновом потоке.

1 голос
/ 07 февраля 2011

Вы можете использовать JComponent.paintImmediately для принудительного немедленного рисования

...