冒泡排序模拟JButton着色

时间:2013-12-19 17:44:20

标签: java swing jframe jbutton bubble-sort

我正在尝试制作一个有助于可视化冒泡排序算法的程序。该脚本正确地对数组进行排序,但是它不允许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)); 
                    }
                }
            }
        }
    }
}

1 个答案:

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