0

我有一个要添加 JLabel 的 JPanel。然后我想删除所有的 JLabel 并添加一些新的。

所以我做了以下事情:

        panel.removeAll();panel.repaint();

        panel.add(new JLabel("Add something new");

        panel.revalidate(); 

这工作正常。当我在此之后启动一个新线程时,我的问题出现了:

    panel.removeAll();panel.repaint();

    (1)panel.add(new JLabel("Add something new");

    panel.revalidate();

    //new thread to start - this thread creates new JLabels that should appear under (1)
    firstProducer.start();              

    try {

            firstProducer.join();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

然后原始 JLabels 的输出仍然可见。我已经读到重新验证过程是一项长时间运行的任务,因此在重新验证正在进行并出现冲突时 firstProducer 线程正在启​​动。处理这个问题的最佳方法是什么?

4

1 回答 1

4

问题是firstProducer.join. 如javadoc中所述

等待这个线程死掉。

因此,您将阻塞事件调度线程,直到您的其他线程Thread完成,因此面板无法重新绘制或重新验证,您将不会在 UI 中看到您的更改。

有关更多信息,请参阅Swing 并发教程

于 2012-12-09T17:00:54.833 回答