【发布时间】:2012-02-19 13:23:07
【问题描述】:
干得好,现在我只想知道为什么如果我将指令 System.out.println 添加到 while 循环中,进度会同时显示在 Gui 中的 cmd 和 Pgbar 上? :
while(progress < 99){
System.out.println("into while of PBar Thread progress = "+progress);
if(progress != Path.operationProgress){
operationProgressBar.setValue(progress);
progress = Path.operationProgress;
operationProgressBar.repaint(); } }
需要一些帮助,我无法让 JProgressBar 更新,我 不能使用 SwingWorker,没有它我必须解决这个问题。变量 Path.operationProgress 是来自“Path”类的静态变量 例如,它是从另一个线程更新的,所以我认为 PBar 和 Path 实例都在用户的线程中执行,而不是在 美东时间 。这是进度条的代码:
import javax.swing.*; public class Pbar extends Thread { JProgressBar operationProgressBar; public Pbar(JProgressBar operationProgressBar) { this.operationProgressBar = operationProgressBar; } @Override public void run() { int progress = Path.operationProgress; while(progress < 99) { if(progress != Path.operationProgress) { operationProgressBar.setValue(progress); progress = Path.operationProgress; operationProgressBar.repaint(); }}} }这是启动线程的操作:
private javax.swing.JProgressBar operationProgressBar; private javax.swing.JLabel pathImage; private javax.swing.JButton simulatedAnnelingButton; public class TSPGUI extends javax.swing.JFrame { TSPMG tspInstance; Path p, result; String filename = ""; int neighborHood_Type = 1, i = 0; // ......Constructor Stuff and init() private void simulatedAnnelingButtonActionPerformed(java.awt.event.ActionEvent evt){
线程 sa = 新线程(){ @Override 公共无效运行(){ 结果 = p.SimulatedAnnealing(neighborHood_Type); 字符串 lastCostString = result.Cost() + ""; lastCostLabel.setText(lastCostString); }}; sa.start(); Pbar pb = new Pbar(operationProgressBar); pb.start(); } //其他一些东西... }
【问题讨论】:
-
尽管您很小心尝试在后台线程中执行操作,但您的问题闻起来像是线程问题——或者正在更新的 JProgressBar 不是正在显示的问题。但是,如果没有更多代码,就很难说。如果上面的代码在后台线程上运行,你必须注意在 EDT 上调用进度条 setValue(...),虽然这不能解决你的问题,但它可以防止一些间歇性异常的发生。我建议您向我们展示更多代码,最好是sscce。
-
请对代码块使用一致且符合逻辑的缩进,并且不需要在每个代码行之后都有空行!
-
另外,你应该努力实现 Runnable 而不是扩展 Thread。另外你是如何运行线程的?你打电话给
start()或run()吗? ...您的问题会引出更多问题,最好还是由sscce 回答。我知道我在这里听起来像是一张破唱片,但如果写得好,这些该死的东西会非常有帮助。 -
更新的代码不可读。请在我的答案下方查看我的 cmets。
标签: java multithreading oracle swing jprogressbar