[英]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循環結束時添加,而所有行在最后一個循環中一次添加。
在控制台中輸出----------
TimerTask已啟動
計時器任務開始於:IST 2014年9月11日10:35:13
TimerTask已取消
計時器任務在IST 2014年9月11日星期四10:35:16完成
TimerTask已啟動
計時器任務開始於:IST 2014年9月11日10:35:19
TimerTask已取消
計時器任務在IST 2014年9月11日星期四10:35:22完成
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.