如何插入计时器以处理排序

时间:2011-12-09 08:22:00

标签: java swing

我一直在努力使用延迟计时器。如何让观察者可以看到交换?并且在交换处理时将颜色放在选定的栏上?顺便提一下,这是一种选择。

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);
      }
   }
 }

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

而不是使用Timer,每次调用它时对整个数组进行排序,而不重写sort方法,只对每个调用中的一个元素进行排序,你可以这样做。

当你使用Timer时,它实际上在重新绘制那个人的同一个线程中执行,所以如果你在这里睡觉那个人就不会重新绘制。

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

然后,在交换并调用重绘后,您可以告诉交换线程暂停一段时间 Thread.sleep(延迟)

JPanel不会在重新绘制之间自行清除,因此您只会看到列增长,永远不会变短。修复paintComponent以清除图形或改为扩展JComponent。

希望这有助于您的进步。