重新验证并重新绘制 - Java Swing

时间:2012-12-09 16:34:06

标签: java swing user-interface concurrency event-dispatching

我有一个JPanel,我正在添加JLabel。然后我想删除所有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();
        }

然后原始JLabel的输出仍然可见。我已经读过,重新验证过程是一个长时间运行的任务,因此firstProducer线程正在开始 重新验证正在进行,并且正在发生冲突。解决这个问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:4)

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

  

等待此线程死亡。

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

有关详细信息,请参阅Swing concurrency tutorial