我正在尝试制作一个有助于可视化冒泡排序算法的程序。该脚本正确地对数组进行排序,但是它不允许JFrame
在完成之前打开。有没有办法让它重新着色所有按钮,然后再进行排序?下面发布的是当前处理排序和着色的类。
public class SortStart {
private JButton[] list;
private int[] randomList;
public SortStart(JButton[] list, int[] randomList){
this.list = list;
this.randomList = randomList;
}
public void run(){
String str = "";
int temp = 0;
int k = 0;
boolean swapped = true;
//Sort the colors
while(swapped){
swapped = false;
k ++;
for(int i = 0; i < randomList.length - k; i ++){
if(randomList[i] > randomList[i+1]){
temp = randomList[i];
randomList[i] = randomList[i+1];
randomList[i+1] = temp;
swapped = true;
for(int l = 0; l < randomList.length; l++){
System.out.print(randomList[l] + ", ");
}
System.out.println();
for(int j = 0; j < randomList.length; j++){
list[j].setBackground(new java.awt.Color(randomList[j],randomList[j],255));
}
}
}
}
}
}
答案 0 :(得分:-1)
SwingWorker只能执行一次,而是使用PropertyChangeListener创建一个带有Runnable类的Thread实例,以反映视图中的更改。 你正在使用视图的线程来运行你的代码,所以没有别的东西可以执行(重绘)直到完成。 在Runnable类中,您应该定义绑定到已修改对象的PropertyChangeSupport对象。并添加方法addPropertyChangeListener(然后在视图中定义PropertyChangeListener),如下所示:
private PropertyChangeSupport mPcs =
new PropertyChangeSupport(this);
public void setMouthWidth(int mw) {
int oldMouthWidth = mMouthWidth;
mMouthWidth = mw;
mPcs.firePropertyChange("mouthWidth", oldMouthWidth, mw); //the modification is "published"
}
public void
addPropertyChangeListener(PropertyChangeListener listener) {
mPcs.addPropertyChangeListener(listener);
}
public void
removePropertyChangeListener(PropertyChangeListener listener) {
mPcs.removePropertyChangeListener(listener);
}