我一直在与延迟计时器作斗争。如何使交换对观察者可见?当交换正在进行的时候,把颜色放在选定的条上?顺便说一下,这是一个选择排序。
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。
希望对你的进步有帮助。