进度条的问题 mPrThread = new Thread(this);mPrThread. // do what you want to do 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 int filesDone=getNumberOfFiles();install.setValue(filesDone); to yonk:我在每次循环的末尾给进度条赋值,for(......){.......jProgressBar1.setValue((int)(((double)(k - firstdis) / (plusdelta * sample)) * 100));//里面的变量不重要}那mPrThread = new Thread(this); mPrThread;这段代码放在什么位置呢?另外线程在这里的作用我还不是很清楚,能否简单介绍一下?谢谢 因为SWING组件不是线程安全的,所以可以用SWING专门为你准备的SwingUtilities.invokeLater()或者invokeAndWait()具体使用可以参看JAVA图形编程卷二或者core JAVA卷二都专门讲到过这个问题 可否这样 让程序执行的过程中让它停一会 等待进度条刷新后再进入循环Thread.sleep(500);//半秒 这是一个典型的swing问题,你最好察看一下《java2图形设计:卷2 swing》书,上面有很详细的解释。 卷二Swing我看过了,不过上面哪个例子是applet,我做的application也可以这样处理吗?重载一个Thread类,然后把自己定义的进度条显示操作写到run()函数里去。然后我可以直接把start()语句加到循环里去吗?for(......){.......MyThread.start();} 我跟踪程序,怎么Mythread.start()后不会执行到覆盖的run()函数里去呢? public void run(){}看看 run 函数有没有写错 我在run()函数里对Progressbar进行setvalue操作,不管写得对不对,跟踪到start()根本就不调用run(),怎么回事啊? 代码简述如下: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); }}为什么没有好心人帮帮忙呢? run()里面只有一句话 他执行完 线程也就退出了所以后面对 setVl 的调用没有产生效果应该在 run 里写成死循环boolean GoOn = true;public void run(){ while(GoOn) progressBar.setValue(Vl);}要停下来的话 就把 GoOn 设为 false 我改了,没用,问题不出在这里,压根到不了run内部 我又运行了一次,发现虽然跟踪不到run,但事实上还是会调用的,然而又有新的问题,进度条不是按照进程一点点显示的,而是循环结束一下子到底的,这是不是意味着进度条的线程还是在主线程运行后才执行呢,能否让他们同步呢? 我有运行了一次,发现虽然跟踪不到run,但事实上还是会调用的,然而又有新的问题,进度条不是按照进程一点点显示的,而是循环结束一下子到底的,这是不是意味着进度条的线程还是在主线程运行后才执行呢,能否让他们同步呢? 程序很长,而且大部分都是无关紧要的代码,既然要看我就贴出来好了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); } }} 进度条的线程 和主线程是 平行运行的只是 这是一个耗时工作 更新进度条也是一个 比较复杂的工作进度条 在 setValue(Vl); 之后来不及更新你就又调用了 setValue(Vl);所以 你应该把 calccorr() 函数也放到 线程里然后在 progressBar.setValue(Vl); 之后 sleep 一小段时间让进度条完成更新或者用 ops2000(吾痴石) 提到的 SwingUtilities.invokeLater()或者invokeAndWait() 方法 也可以 SwingUtilities.invokeLater()方法该怎么用呢,写在什么位置? 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是不是都要定义一个现成的对象阿? 我现在在网吧你先看看这篇文章吧http://www.javaresearch.org/article/showarticle.jsp?column=287&thread=4429等我回去在给你详细解释 有关变量输出的小问题 java 多线程连接mysql Socket通讯问题!!急急 java笔试帖 今天又栽在一个简单题目上 用applet上传时出现的问题 JAVA操作MySQL数据库的乱码问题,如何解决? 多线程Applet,高手来看看!(30分) 随机数 JDBC要怎么设置才能和MYSQL数据库连接?? Eclipse 怎么开启括号自动补全 菜鸟问题:Java可以使用ADO吗?怎样使用? 阅读原码经典问题之一----阅读sdk原码的疑惑,关于:System.props
install.setValue(filesDone);
我在每次循环的末尾给进度条赋值,
for(......)
{
.......
jProgressBar1.setValue((int)(((double)(k - firstdis) / (plusdelta * sample)) * 100));//里面的变量不重要
}
那mPrThread = new Thread(this);
mPrThread;
这段代码放在什么位置呢?
另外线程在这里的作用我还不是很清楚,能否简单介绍一下?谢谢
具体使用可以参看JAVA图形编程卷二或者core JAVA卷二
都专门讲到过这个问题
Thread.sleep(500);//半秒
for(......)
{
.......
MyThread.start();
}
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);
}
}
为什么没有好心人帮帮忙呢?
里面只有一句话 他执行完 线程也就退出了
所以后面对 setVl 的调用没有产生效果应该在 run 里写成死循环boolean GoOn = true;
public void run(){
while(GoOn)
progressBar.setValue(Vl);
}要停下来的话 就把 GoOn 设为 false
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);
} }
}
只是 这是一个耗时工作 更新进度条也是一个 比较复杂的工作
进度条 在 setValue(Vl); 之后来不及更新
你就又调用了 setValue(Vl);所以 你应该把 calccorr() 函数也放到 线程里
然后在 progressBar.setValue(Vl); 之后 sleep 一小段时间
让进度条完成更新或者用 ops2000(吾痴石) 提到的
SwingUtilities.invokeLater()或者invokeAndWait() 方法 也可以
我的进度条把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是不是都要定义一个现成的对象阿?
你先看看这篇文章吧
http://www.javaresearch.org/article/showarticle.jsp?column=287&thread=4429
等我回去在给你详细解释