我用Netbeans6.5创建了Java Application,并且自定义了菜单项,想实现:当单击某一菜单项的时候程序开始进行相应的处理,与此同时,我想加入“不确定进度条”(即Indeterminated Progressbar)来表示程序正在进行某项处理,让程序界面显得更亲切,于是在菜单项相应的响应函数中(public void actionPerformed(java.awt.event.ActionEvent evt) {  contentMenuItemActionPerformed(evt);})加入了显示“不确定进度条”的线程(class ProgressBar implements Runnable)。
但是每次都等到public void actionPerformed(evt) 运行后进度条才开始运行,很是郁闷希望高手能给我指点迷津,非常感谢!代码大致结构如下://当点击某一菜单项时,程序会自动调用如下函数
contentMenuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                contentMenuItemActionPerformed(evt);
            }
        });//程序接着执行下面的代码
private void contentMenuItemActionPerformed(java.awt.event.ActionEvent evt) {
         ………………
         //在这里创建进度条线程
          Runnable r = new Progressbar();
          Thread t = new Thread(r);
          t.run();
}
 

解决方案 »

  1.   

    发完帖子之后发现无法再次修改,因此把“代码大致结构”再发一下://当点击某一菜单项时,程序会自动调用如下函数
    contentMenuItem.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    contentMenuItemActionPerformed(evt);
                }
            });//程序转入到下面的代码
    private void contentMenuItemActionPerformed(java.awt.event.ActionEvent evt) {
             function1(){
                  //在这里创建进度条线程
                  Runnable r = new Progressbar();
                  Thread t = new Thread(r);
                  t.run();              //真正的处理过程
                  …………
             }
            
    }//ProgressBar类
    class ProgressBar implements Runnable{
            JProgressBar p;
            ProgressBar(JProgressBar pb){
                p = pb;
            }
            public void run() {
                 p.setIndeterminate(true);
            }
    }
    还有就是: 在我看的资料里,都说线程是轮换执行的。因此创建了ProgressBar这个线程,可能只有数毫秒时间,然后就被切换到其它进程——不知小弟这样理解是否正确,因此一开始无法执行,等第一段代码执行完成后,没有了线程的轮换,才让ProgressBar专心致志的执行。
      

  2.   

    运行后进度条才开始运行,很是郁闷
    =============================
    我觉得是你的菜单响应处理太快了,进度条并且你应该在菜单响应结束时cancel那个进度条线程
      

  3.   

    运行后进度条才开始运行,很是郁闷
    =============================
    我觉得是你的菜单响应处理太快了,并且你应该在菜单响应结束时cancel那个进度条线程
      

  4.   

    这个问题蛮简单的,问题在于你这段代码: Runnable r = new Progressbar();
              Thread t = new Thread(r);
              t.run();t应该调用线程的启动方法不是t.run()而是t.start(),调用这个方法t线程才能启动,不然就是调用一个普通的类方法,当然是顺序执行下去啦.
      

  5.   

    把swing放在事件处理线程中javax.swing.SwingUtilities.invokeLater(doRun);
      

  6.   


    个人感觉您好像已经明白我的意思了
    我也正在查阅相关资料我遇到的问题可以这样描述:actionPerformed();返回的时候“进度条”才开始运行。
      

  7.   

    把代码贴出来吧,详细考察下,我觉得执行过程没问题,把
    private void contentMenuItemActionPerformed(java.awt.event.ActionEvent evt) {
             function1(){
                  //在这里创建进度条线程
                  Runnable r = new Progressbar();
                  Thread t = new Thread(r);
                  t.run();              //真正的处理过程
                  …………
             }
            
    }
    贴完全,来看看.
    把swing放在事件处理线程中javax.swing.SwingUtilities.invokeLater(doRun); 应该还是不能解决问题.
      

  8.   

    问题终于得到解决,可喜可贺,但这绝对不是我一个人的功劳,非计算机专业出身的我感谢回答问题的各位高手!问题的解决方法很简单,但首先我想把这次问题的解决过程总结一下:
    1. 我想达成的目的很简单:让程序一边执行某一项操作,一边运行“不确定进度条”,于是在网上搜了一些关于“进度条”的代码,照猫画虎的写成了上面的样子——最后才发现我在发帖的时候把问题描述的过于复杂,上面的代码本身就有很大的问题,各位高手当然不容易解答;
    2. 看到13楼“nethaoke”的回答,并尝试着修改代码,效果略有显现,但程序能不能很好的执行——因为javax.swing.SwingUtilities.invokeLater(doRun); 会在事件响应函数中发生锁死现象,程序无法继续执行,于是开始关注线程的同步和异步运行;
    3. 一开始总是以为“进度条在执行完actionPerformed();之后才开始运行”这个问题与线程的轮换执行有关,结果我的判断是正确的,它与代码中的function1(){ ……}函数有很大关系。解决方法:将[color=#0000FF]function1(){ ……}放入独立的线程;[/color]
    4. 接着给"进度条"new一个线程;
    5. 问题解决,就是15楼“zhanghua4109”的“多线程方法”——一般高手不屑于回答基础性质的问题,所以15楼没贴代码是可以理解的,我也要多多努力搞清楚线程方面的知识。下面是我修改后的代码(因为程序非常简单,怕各位高手笑话,所以只贴出大致代码)://当点击某一菜单项时,程序会自动调用如下函数
    contentMenuItem.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    ontentMenuItemActionPerformed(evt);
                }
            });//程序转入到下面的代码
    private void contentMenuItemActionPerformed(java.awt.event.ActionEvent evt){
                  //创建进度条线程
                  ProgressBar pb = new ProgressBar(ProgressBar1); //ProgressBar1是通过Netbeans视图工具创建的,不用纠缠于ProgressBar1的身世问题
                  Thread t1 = new Thread(pb, "ProgressBar");
                  t1.start();              class_function f = new class_function();   //程序进行一些操作
                  Thread t2 = new Thread(f, "function");
                  t2.start();        
    }//ProgressBar类
    class ProgressBar extends JProgressBar implements Runnable{
           JProgressBar ProgressBar;
            ProgressBar(JProgressBar pb){
                ProgressBar = pb;
            }
            public void run() {
                ProgressBar.setIndeterminate(true);
            }
            public void DestroyBar(){
                ProgressBar.setIndeterminate(false);
            }
    }//class_function类
    public class class_function implements Runnable{
            …………
    }就这么简单!