在小弟的一个程序中有一个界面,其中有一批文本框要求用户输入数据,然后点击检查按钮后将检查结果在一个JLabel上显示出来。用户输入的项不少,因此检查的项也不少,有直接界面检查可以得到结果的,有需要网络调用的,有需要查数据库的,时间长短不一。起初我想做到这样的效果,即一项检查通过则在JLabel上显示出来,有一项不通过则检查中止并告知用户原因,比如说检查项有9项,前面八项都通过,后面一项不通过,预想的效果是在JLabel上依次显示前面八项的正确结果和最后一项的错误结果。但是,程序运行起来后,我发现它只显示最后的结果,也就是前八项要求JLabel修改文字的命令似乎界面完全不执行,只执行最后一项!我用线程去跟,发现每句要求JLabel修改文字的命令都按预想的跑到了,界面文字也随即作出了变动。但是直接执行的时候就还是上面提到的效果。我想并不是程序跑得快的原因,因为有些检查步骤耗时以秒来计量,在这么长的时间内足够JLabel修改文字了,但它在检查期间就像僵死一样,直到显示最后一项。请问大家这是什么原因,我能采取什么方法来达到预想的效果?

解决方案 »

  1.   

    看都看迷糊了。  label.setText(label.getText()+"iii");这个和线程有关系吗  没看懂你说的啥 分行显示也行 写html 每行加br
      

  2.   

    你可以查一下SwingWorker的文档,里面说的很清楚:
    public abstract class SwingWorker<T,V>extends Objectimplements RunnableFuture<T>在专用线程中执行长时间 GUI 交互任务的抽象类。 使用 Swing 编写多线程应用程序时,要记住两个约束条件:(有关详细信息,请参阅 How to Use Threads): 不应该在事件指派线程 上运行耗时任务。否则应用程序将无响应。 
    只能在事件指派线程 上访问 Swing 组件。 这些约束意味着需要时间密集计算操作的 GUI 应用程序至少需要以下两个线程:1) 执行长时间任务的线程; 2) 所有 GUI 相关活动的事件指派线程 (EDT)这涉及到难以实现的线程间通信。 SwingWorker 设计用于需要在后台线程中运行长时间运行任务的情况,并可在完成后或者在处理过程中向 UI 提供更新。SwingWorker 的子类必须实现 doInBackground() 方法,以执行后台计算。 
    ......
      

  3.   

    这个在Web中操作起来就简单多了,javascript就可以搞定了~
    在Swing下,应该也是类似的~
      

  4.   

    谢谢大家,这个问题我用新线程+InvokeLater+延时搞定了。