不要将元素逐个元素添加到JList,直到循环结束

时间:2014-09-11 05:32:28

标签: java timer jlist

我正在为作业制作算法模拟器,我需要在算法中逐行显示。

这是我的插入排序算法代码:

private void insertionSort(int array[]) {
    DefaultListModel dlm = new DefaultListModel();
    algoShowingList.setModel(dlm);

    MyTimerTask mt = new MyTimerTask();

    int key, i = 0;

    for (int j = 1; j <= array.length - 1; j++) {
        dlm.removeAllElements();
        dlm.addElement("1. for j = " + (j + 1) + " to " + array.length);
        System.out.println("1. for j = " + (j + 1) + " to " + array.length);
        mt.delayRunning();

        dlm.addElement("2.     key = " + array[j]);
        System.out.println("2.     key = " + array[j]);
        key = array[j];
        mt.delayRunning();


        dlm.addElement("3.     i = " + i);
        System.out.println("3.     i = " + i);
        i = j - 1;
        mt.delayRunning();

        dlm.addElement("4.     while " + i + ">0 and " + array[i] + ">" + key);
        while (i > 0 && array[i] > key) {
            dlm.removeElementAt(3);
            dlm.addElement("4.     while " + i + ">0 and " + array[i] + ">" + key);


            if (algoShowingList.getLastVisibleIndex() == 4) {
                dlm.removeElementAt(4);
            }
            dlm.addElement("5.         array[" + (i + 1) + "] = " + array[i]);
            //changing txtfield colors
            changeColorToRed(findTextField(array[i + 1]));
            changeColorToGreen(findTextField(array[i]));

            array[i + 1] = array[i];
            printInitialArray(array);
            changeColorToGreen(findTextField(array[i + 1]));

            if (algoShowingList.getLastVisibleIndex() == 5) {
                dlm.removeElementAt(5);
            }
            dlm.addElement("6.         i = " + i);
            i = i - 1;
        }

        dlm.addElement("7. Array[" + (i + 1) + "] = " + key);
        array[i + 1] = key;
        printInitialArray(array);
        changeColorToRed(findTextField(key));

        resetTextFieldColorToDefault();
        printOneLoopInsertionSort(array, j);
    }

}

通过调用mt.delayRunning();我可以延迟执行下一行3秒,我的问题是我想在代码运行时逐个元素地添加到JList。

        dlm.addElement("1. for j = " + (j + 1) + " to " + array.length);
        System.out.println("1. for j = " + (j + 1) + " to " + array.length);
        mt.delayRunning();

        dlm.addElement("2.     key = " + array[j]);
        System.out.println("2.     key = " + array[j]);
        key = array[j];
        mt.delayRunning();

像这样System.out.println()逐行打印我想要将元素添加到JList,但它只在for循环结束时添加,并且为最后一个循环一次添加所有行。

在控制台输出----------

  1. 表示j = 2到10次打印但没有添加到JList
  2. TimerTask已启动

    计时器任务开始于:2014年9月11日星期四10:35:13 IST 2014

    TimerTask已取消

    计时器任务结束于:2014年9月11日星期四10:35:16 IST 2014

    1. key = 9 -sout print但不添加到JList
    2. TimerTask已启动

      计时器任务开始于:2014年9月11日星期四10:35:19 IST 2014

      TimerTask已取消

      计时器任务结束于:2014年9月11日星期四10:35:22 IST 2014

      1. i = 0 -sout打印但不添加到JList
      2. TimerTask已启动

        计时器任务开始于:2014年9月11日星期四10:35:25 IST 2014

        TimerTask已取消

        计时器任务结束于:2014年9月11日星期四10:35:28 IST 2014

        当循环结束时,所有元素都添加到JList,我需要逐个显示,有人可以帮助我! 我找不到为什么会发生这种情况!

1 个答案:

答案 0 :(得分:0)

Swing是一个单线程环境,这意味着两个(基本的)事情,首先,你永远不应该阻止事件调度线程(包括Thread.sleep),因为这会阻止UI被更新。其次,除了在EDT的上下文之外,你不应该以任何方式更新或修改UI。

有关详细信息,请参阅Concurrency in Swing

现在,您可能有多种方法可以实现此目的,但最简单的方法可能是使用SwingWorker,在doInBackground方法的上下文中进行排序(和暂停),使用publish / process更新用户界面,这样您就不会阻止事件调度线程

有关详细信息,请参阅Worker Threads and SwingWorker