2011-02-07 2 views
2

Я пытаюсь создать программу, которая будет визуализировать различные алгоритмы сортировки, рисуя набор столбцов, представляющих массив, для каждого цикла сортировки. Однако, когда я устанавливаю массив из класса сортировщика, который, в свою очередь, перерисовывает панель, кажется, что он вызывает только paintComponent() для первой и последней итераций, не показывая шаги между ними.Перекрашивание JPanel в петле с задержкой

Вот своего рода код, который вызывает метод 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("."); 
} 

Я знаю, что это не перерисовываясь между ними (с задержкой или без нее), потому что он печатает только один ». когда я начну сортировку.

+0

Возможный дубликат ... http://stackoverflow.com/questions/4120528/repaint-in-a-loop –

ответ

2

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

1

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

+0

Нет, это не поможет. –

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