我一直在努力使用延迟计时器。如何让观察者可以看到交换?并且在交换处理时将颜色放在选定的栏上?顺便提一下,这是一种选择。
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);
}
}
}
答案 0 :(得分:2)
javax.swing.Timer
是一个不错的选择,因为它隐藏了用于等待的线程并在绘制时触发。只需在计时器的actionPerformed()
方法中绘制一个交换的结果。您必须重新组织selectionSort()
,以便它可以一次运行一步。有一个相关的Timer
示例here。
答案 1 :(得分:1)
而不是使用Timer,每次调用它时对整个数组进行排序,而不重写sort方法,只对每个调用中的一个元素进行排序,你可以这样做。
当你使用Timer时,它实际上在重新绘制那个人的同一个线程中执行,所以如果你在这里睡觉那个人就不会重新绘制。
相反,将您的交换器更改为 Runnable ,并使用您的交换器创建一个新线程并启动该线程。
然后,在交换并调用重绘后,您可以告诉交换线程暂停一段时间 Thread.sleep(延迟)。
JPanel不会在重新绘制之间自行清除,因此您只会看到列增长,永远不会变短。修复paintComponent以清除图形或改为扩展JComponent。
希望这有助于您的进步。