mPrThread = new Thread(this);
mPrThread. // do what you want to do

解决方案 »

  1.   

    int filesDone=getNumberOfFiles();
    install.setValue(filesDone);
      

  2.   

    to yonk:
    我在每次循环的末尾给进度条赋值,
    for(......)
    {
    .......
    jProgressBar1.setValue((int)(((double)(k - firstdis) / (plusdelta * sample)) * 100));//里面的变量不重要
    }
    那mPrThread = new Thread(this);
      mPrThread;
    这段代码放在什么位置呢?
    另外线程在这里的作用我还不是很清楚,能否简单介绍一下?谢谢
      

  3.   

    因为SWING组件不是线程安全的,所以可以用SWING专门为你准备的SwingUtilities.invokeLater()或者invokeAndWait()
    具体使用可以参看JAVA图形编程卷二或者core JAVA卷二
    都专门讲到过这个问题
      

  4.   

    可否这样 让程序执行的过程中让它停一会 等待进度条刷新后再进入循环
    Thread.sleep(500);//半秒
      

  5.   

    这是一个典型的swing问题,你最好察看一下《java2图形设计:卷2 swing》书,上面有很详细的解释。
      

  6.   

    卷二Swing我看过了,不过上面哪个例子是applet,我做的application也可以这样处理吗?重载一个Thread类,然后把自己定义的进度条显示操作写到run()函数里去。然后我可以直接把start()语句加到循环里去吗?
    for(......)
    {
    .......
    MyThread.start();
    }
      

  7.   

    我跟踪程序,怎么Mythread.start()后不会执行到覆盖的run()函数里去呢?
      

  8.   

    public void run(){}看看 run 函数有没有写错
      

  9.   

    我在run()函数里对Progressbar进行setvalue操作,不管写得对不对,跟踪到start()根本就不调用run(),怎么回事啊?
      

  10.   

    代码简述如下:
    if(progressThread == null||!progressThread.isAlive())
        {
          progressThread = new ProgressThread(jProgressBar1);
          progressThread.start();
        }
        for(k = firstdis;k < lastdis; k += plusdelta)
        {
              ........
              ........
              progressThread.setVl(k - firstdis);
        }
    我定义的progressThread类如下:
    class ProgressThread extends Thread{
      JProgressBar progressBar;
      int Vl;  public ProgressThread(JProgressBar progressBar){
        this.progressBar = progressBar;
      }  public void setVl(int v){
        Vl = v;
      }  public void run(){
        progressBar.setValue(Vl);
      }
    }
    为什么没有好心人帮帮忙呢?
      

  11.   

    run()
    里面只有一句话 他执行完 线程也就退出了
    所以后面对 setVl 的调用没有产生效果应该在 run 里写成死循环boolean GoOn = true;
    public void run(){
      while(GoOn)
        progressBar.setValue(Vl);
    }要停下来的话 就把 GoOn 设为 false
      

  12.   

    我改了,没用,问题不出在这里,压根到不了run内部
      

  13.   

    我又运行了一次,发现虽然跟踪不到run,但事实上还是会调用的,然而又有新的问题,进度条不是按照进程一点点显示的,而是循环结束一下子到底的,这是不是意味着进度条的线程还是在主线程运行后才执行呢,能否让他们同步呢?
      

  14.   

    我有运行了一次,发现虽然跟踪不到run,但事实上还是会调用的,然而又有新的问题,进度条不是按照进程一点点显示的,而是循环结束一下子到底的,这是不是意味着进度条的线程还是在主线程运行后才执行呢,能否让他们同步呢?
      

  15.   

    程序很长,而且大部分都是无关紧要的代码,既然要看我就贴出来好了
    public void calccorr(){//这是用互信息公式计算基因序列相关性的函数
        int i,j,ii,jj,k,plusdelta,firstdis,lastdis,units,indexhead = 0,indextail = 0,denominator,headpoint,tailpoint;
        double y[][] = new double[4][200];
        double x[][] = new double[4][200];
        double a = 0.0,t = 0.0,c = 0.0,g = 0.0, prob_ij = 0.0;
        double prob[] = new double[64];
        int r1=0,r2=0;
        String sq;
        int test16;
        String lettertable[][] = {
                                    {"a","t","c","g"},
                                    {"aa","at","ac","ag","ta","tt","tc","tg",
                                     "ca","ct","cc","cg","ga","gt","gc","gg"},
                                    {"aaa","aat","aac","aag","ata","att","atc","atg",
                                     "aca","act","acc","acg","aga","agt","agc","agg",
                                     "taa","tat","tac","tag","tta","ttt","ttc","ttg",
                                     "tca","tct","tcc","tcg","tga","tgt","tgc","tgg",
                                     "caa","cat","cac","cag","cta","ctt","ctc","ctg",
                                     "cca","cct","ccc","ccg","cga","cgt","cgc","cgg",
                                     "gaa","gat","gac","gag","gta","gtt","gtc","gtg",
                                     "gca","gct","gcc","gcg","gga","ggt","ggc","ggg"}
                                 };
        if(dr.ifMore == 0)
        {
          maximum = 0.0;
          minimum = 10.0;
        }
        firstdis = Integer.parseInt(jTextField1.getText());
        lastdis = Integer.parseInt(jTextField2.getText());
        units = Integer.parseInt(jTextField3.getText());
        headpoint = Integer.parseInt(jTextField4.getText()) - 1;
        tailpoint = Integer.parseInt(jTextField5.getText()) - 1;
        if(tailpoint != sequence.length())
          sq = sequence.substring(headpoint,tailpoint);
        else
          sq = sequence.substring(headpoint);
        int len = sq.length(),exponent = 0;
        for(i = 0;i < Math.pow(4.0,units);i ++)
          prob[i] = 0;
        for(i = 0;i < len - units;i++)
          for(j = 0;j < Math.pow(4.0,units);j ++)
            if(sq.substring(i,i + units).compareToIgnoreCase(lettertable[units - 1][j]) == 0)
            {
              prob[j] ++;
              break;
            }
        for(j = 0;j < Math.pow(4.0,units);j ++)
            if(sq.substring(i).compareToIgnoreCase(lettertable[units - 1][j]) == 0)
            {
              prob[j] ++;
              break;
            }
        for(i = 0;i < Math.pow(4.0,units);i ++)
          prob[i] /= (len - units + 1);}
        choicelen = lastdis - firstdis;
        sample = choicelen;
        plusdelta = 1;
        if(choicelen > 200)
        {
          plusdelta = choicelen / 200;
          if(plusdelta * 200 != choicelen)
            plusdelta += 1;
          sample = choicelen / plusdelta;
        }
        for(i = 0;i < sample;i ++)
          corr_arr[dr.ifMore][i] = 0.0;
        jProgressBar1.setMaximum(plusdelta * sample);
        if(progressThread == null||!progressThread.isAlive())
        {
          progressThread = new ProgressThread(jProgressBar1);
          progressThread.start();
        }
        for(k = firstdis;k < lastdis; k += plusdelta)
        {
          denominator = len - k - units;
          else{
          for(i = 0;i < Math.pow(4.0,units);i ++)
          {
            for(j = 0;j < Math.pow(4.0,units);j ++)
            {
              indextail = indexhead + k + units - 1;
              while(indextail < len - units)
              {
                if((sq.substring(indexhead,indexhead + units).compareToIgnoreCase(lettertable[units - 1][i]) == 0)
                   &&(sq.substring(indextail,indextail + units).compareToIgnoreCase(lettertable[units - 1][j]) == 0))
                  prob_ij += 1;
                indexhead ++;
                indextail ++;
              }
              if((sq.substring(indexhead,indexhead + units).compareToIgnoreCase(lettertable[units - 1][i]) == 0)
                   &&(sq.substring(indextail).compareToIgnoreCase(lettertable[units - 1][j]) == 0))
                prob_ij += 1;
              prob_ij = prob_ij / denominator;
              if((prob_ij != 0)&&(prob_ij >= (prob[i] * prob[j])))
                corr_arr[dr.ifMore][(k - firstdis) / plusdelta] += prob_ij * Math.log(prob_ij / (prob[i] * prob[j])) / Math.log(2.0);
              prob_ij = 0.0;
              indexhead = 0;
              indextail = 0;
            }
          }}
          //jProgressBar1.setValue((int)(((double)(k - firstdis) / (plusdelta * sample)) * 100));
          progressThread.setVl(k - firstdis);
        }
        if(ifall != 1)
        {
          for(i = 0;i < sample;i ++)
          {
            if(corr_arr[dr.ifMore][i] > maximum)
              maximum = corr_arr[dr.ifMore][i];
            if(corr_arr[dr.ifMore][i] < minimum)
              minimum = corr_arr[dr.ifMore][i];
          }
          dr.jLabel3.setText("" + maximum);
          dr.jLabel5.setText("" + minimum);
          dr.dp.num[dr.ifMore] = sample;
          String str = new String("");
          str += "相关距离范围" + firstdis + "~" + lastdis + "\n";
          for(j = 0;j <= dr.ifMore;j ++)
          {
            dr.svd.value.addElement(new double[200]);
            dr.svd.value.setElementAt(corr_arr[j],j);
            for(i = 0;i < dr.dp.num[j];i ++)
            {
              str += ((double[])dr.svd.value.elementAt(j))[i];
              str += "\n";
              y[j][i] = 430 - (corr_arr[j][i] - minimum) * 400 / (maximum - minimum);
              x[j][i] = 30 + i * (200 / dr.dp.num[j]) * 3;
            }
            dr.dp.draw_y.setElementAt(y[j],j);
            dr.dp.draw_x.setElementAt(x[j],j);
            str += "\n";
            dr.svd.value.trimToSize();
          }
          dr.svd.jTextArea1.setText(str);
          dr.show();
          jTextField1.setText("1");
          jTextField2.setText("100");
          jTextField3.setText("1");
          jTextField4.setText("1");
          //jTextField5.setText("");
          jTextField2.getDocument().addDocumentListener(tdl);
        }
      }派生的thread类如下:
    class ProgressThread extends Thread{
      JProgressBar progressBar;
      int Vl;  public ProgressThread(JProgressBar progressBar){
        this.progressBar = progressBar;
      }  public void setVl(int v){
        Vl = v;
      }  public void run(){
        while(true)
          {
            progressBar.setValue(Vl);
          }  }
    }
      

  16.   

    进度条的线程 和主线程是 平行运行的
    只是 这是一个耗时工作 更新进度条也是一个 比较复杂的工作
    进度条 在 setValue(Vl); 之后来不及更新
    你就又调用了 setValue(Vl);所以 你应该把 calccorr() 函数也放到 线程里
    然后在 progressBar.setValue(Vl); 之后 sleep 一小段时间
    让进度条完成更新或者用 ops2000(吾痴石) 提到的
     SwingUtilities.invokeLater()或者invokeAndWait() 方法 也可以
      

  17.   

    SwingUtilities.invokeLater()方法该怎么用呢,写在什么位置?
      

  18.   

    to telenths:
    我的进度条把SwingUtilities.invokeLater(runnable);加进去了,改动如下,可还是不行,和原来毛病一样。
    class ProgressThread extends Thread{
      //JProgressBar progressBar;
      Runnable runnable;
      int Vl;  public ProgressThread(final SeqAnalysisFrame saf){
        //this.progressBar = progressBar;
        runnable = new Runnable(){
          public void run(){
            JProgressBar progressBar = saf.jProgressBar1;
            progressBar.setValue(Vl);
          }
        };  }  public void setVl(int v){
        Vl = v;
      }  public void run(){
        try{
          while(true)
          {
            //Thread.currentThread().sleep(500);
            SwingUtilities.invokeLater(runnable);
            sleep(100);
          }
        }catch(InterruptedException e){
        }
      }
    }
    你说的另一种方法,把calccorr()也放进线程里,是不是指在线程的run()里调用calccorr()呢,那这样的话其他地方调用calccorr是不是都要定义一个现成的对象阿?
      

  19.   

    我现在在网吧
    你先看看这篇文章吧
    http://www.javaresearch.org/article/showarticle.jsp?column=287&thread=4429
    等我回去在给你详细解释