【问题标题】:Not adding element by element to JList until for loop ends在 for 循环结束之前不将元素逐个添加到 JList
【发布时间】:2014-09-11 05:32:27
【问题描述】:

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

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

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 开始

定时器任务开始于:Thu Sep 11 10:35:13 IST 2014

TimerTask 已取消

定时器任务完成时间:Thu Sep 11 10:35:16 IST 2014

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

TimerTask 开始

定时器任务开始于:Thu Sep 11 10:35:19 IST 2014

TimerTask 已取消

定时器任务完成时间:Thu Sep 11 10:35:22 IST 2014

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

TimerTask 开始

定时器任务开始于:Thu Sep 11 10:35:25 IST 2014

TimerTask 已取消

定时器任务完成时间:Thu Sep 11 10:35:28 IST 2014

循环结束时添加到JList的所有元素,我需要一个一个显示,有人可以帮助我! 我找不到为什么会这样!

【问题讨论】:

    标签: java timer jlist


    【解决方案1】:

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

    详情请见Concurrency in Swing

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

    详情请见Worker Threads and SwingWorker

    【讨论】:

    • 谢谢你的回复。你能给我一个例子吗?喜欢如何修改我的代码?
    • dlm.addElement("1. for j = " + (j + 1) + " to " + array.length); System.out.println("1. for j = " + (j + 1) + " to " + array.length); // SwingUtilities.invokeAndWait(new Runnable() { public void run() { try { Thread.sleep(3000); } catch (InterruptedException ex) { Logger.getLogger(MainWindow.class.getName()).log(Level.严重,空,前);}}});
    • 从此我可以根据需要添加一个元素,但它给了我一个“线程中的异常“AWT-EventQueue-0”java.lang.Error:无法从事件调度程序线程调用invokeAndWait”你能帮我解决这个问题吗?
    • 我不理你,不在电脑前
    • 没关系,等你回来能不能回答一下,我还是被这个卡住了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    相关资源
    最近更新 更多