簡體   English   中英

直到for循環結束時,才逐元素添加到JList

[英]Not adding element by element to JList until for loop ends

我正在為作業創建算法模擬器,我需要在算法中逐行顯示。

這是我的插入排序算法代碼:

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 -sout打印,但不添加到JList

TimerTask已啟動

計時器任務開始於:IST 2014年9月11日10:35:13

TimerTask已取消

計時器任務在IST 2014年9月11日星期四10:35:16完成

  1. key = 9 -sout打印但不添加到JList

TimerTask已啟動

計時器任務開始於:IST 2014年9月11日10:35:19

TimerTask已取消

計時器任務在IST 2014年9月11日星期四10:35:22完成

  1. i = 0 -sout打印但不添加到JList

TimerTask已啟動

計時器任務開始於:IST 2014年9月11日10:35:25

TimerTask已取消

計時器任務在IST 2014年9月11日星期四10:35:28完成

循環結束時添加到JList的所有元素,我需要一個一個地顯示,有人可以幫我! 我找不到為什么發生這種情況!

Swing是一個單線程環境,這意味着兩件事(第一件事),首先,無論如何都不要阻止Event Dispatching Thread(包括Thread.sleep ),因為這將阻止UI的更新。 其次,除了在EDT上下文中之外,絕不要以其他方式更新或修改UI。

有關更多詳細信息,請參見Swing中的並發。

現在,可能有多種方法可以實現此目的,但是最簡單的方法可能是使用SwingWorker ,在doInBackground方法的上下文中進行排序(和暫停)並使用publish / process來更新UI。您將不會阻止事件調度線程

有關更多詳細信息,請參見工作線程和SwingWorker

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM