我正在为作业制作一个算法模拟器,我需要在算法中逐行显示。
这是我的插入排序算法代码:
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 循环结束并且为最后一个循环一次添加所有行时添加。
控制台输出----------
- for j = 2 to 10 -sout 打印但不添加到 JList
定时器任务已启动
计时器任务开始于:2014 年 9 月 11 日星期四 10:35:13 IST
定时器任务已取消
计时器任务完成时间:Thu Sep 11 10:35:16 IST 2014
- key = 9 -sout 打印但不添加到 JList
定时器任务已启动
计时器任务开始于:2014 年 9 月 11 日星期四 10:35:19 IST
定时器任务已取消
计时器任务完成时间:Thu Sep 11 10:35:22 IST 2014
- i = 0 -sout 打印但不添加到 JList
定时器任务已启动
计时器任务开始于:2014 年 9 月 11 日星期四 10:35:25 IST
定时器任务已取消
计时器任务完成时间:Thu Sep 11 10:35:28 IST 2014
循环结束时添加到 JList 的所有元素,我需要一一显示,有人可以帮助我吗! 我找不到为什么会发生这种情况!
最佳答案
Swing 是一个单线程环境,这意味着两件事(基本),首先,您永远不应该以任何方式阻塞事件调度线程(包括 Thread.sleep ),因为这会阻止 UI从已更新。其次,除了 EDT 上下文之外,您不应该以任何其他方式更新或修改 UI。
参见Concurrency in Swing了解更多详情
现在,可能有多种方法可以实现此目的,但最简单的可能是使用 SwingWorker
,在 doInBackground 的上下文中进行排序(和暂停)
方法并使用 publish
/process
更新 UI,这样就不会阻塞事件调度线程
参见Worker Threads and SwingWorker了解更多详情
关于java - 在 for 循环结束之前不将元素逐个添加到 JList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25779756/