如何插入定时器进行排序处理



我一直在与延迟计时器作斗争。如何使交换对观察者可见?当交换正在进行的时候,把颜色放在选定的条上?顺便说一下,这是一个选择排序。

selectionSort2.java

 /**
 *
 * @author Yuvinng
 */
 import java.awt.*; 
 import javax.swing.*;
import java.util.Random;
import javax.swing.Timer;
import java.awt.event.*;
 public class SelectionSortPanel2  extends JPanel{
protected JButton selection;
private final int width=400,height=400;
private static Random generator;
private int[] list=new int[100];
private Timer timer;

public void selectionSort(int[] list)
{
int min;
int temp;
for(int index=0; index<list.length-1;index++)
{
min=index;
for(int scan=index+1;scan<list.length;scan++)
 if(list[scan]<(list[min]))
     min=scan;
temp=list[min];
list[min]=list[index];
 list[index]=temp;
repaint();
}    
}
private class swapper implements ActionListener 
   {
      public void actionPerformed(ActionEvent event)
      {   
         selectionSort(list);
      }
   }
 }

javax.swing.Timer是一个很好的选择,因为它隐藏了用于等待的线程,并在需要绘制时触发。只需在计时器的actionPerformed()方法中绘制一次交换的结果。您必须重新组织selectionSort(),以便它可以一次运行一步。这里有一个相关的Timer例子

不需要使用每次调用时对整个数组进行排序的Timer,也不需要重写排序方法以在每次调用时只对一个元素排序,您可以这样做。

当你使用计时器时,它实际上是在同一个线程中执行的,所以如果你在这里做任何睡眠,这个家伙不会重画。

相反,将你的交换器更改为Runnable,并使用你的交换器创建一个新线程并启动该线程。

然后,在交换和调用repaint之后,你可以告诉交换线程休眠一会儿 thread .sleep(delay)

JPanel在重绘之间不会清除自己,所以你只会看到列增长,而不会变短。要么修复paintComponent以清除图形,要么扩展JComponent。

希望对你的进步有帮助。

最新更新