いい仕事です。whileループに追加すると、GuiのcmdとPgbarの両方に進行状況が表示されるSystem.out.println命令が表示されるのはなぜですか?:
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インスタンスはどちらも、EDTではなくユーザーのスレッドで実行されると思います。これがプログレスバーのコードです:
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=new Thread(){@Override public void run(){result = p.SimulatedAnnealing(neighborHood_Type); 文字列lastCostString=result.Cost()+ ""; lastCostLabel.setText(lastCostString); }}; sa.start(); Pbar pb = new Pbar(operationProgressBar); pb.start(); }//その他のもの...}