1

我對這個作品的JFrame的代碼,將顯示用戶在圖片的導入時間進度:爲什麼我的JFrame不更新

public class LoadFrame implements Runnable { 

    JProgressBar progressbar; 
    JPanel loadpanel; 
    MainScreen mainscreen; 
    int progress; 
    JDialog mainloadframe; 

    public LoadFrame(String operation) { 

     mainloadframe = new JDialog(); 
     JLabel operationlabel = new JLabel(operation); 
     progressbar = new JProgressBar(0, 100); 
     loadpanel = new JPanel(); 

     mainloadframe.setSize(300, 75); 
     mainloadframe.setLocationRelativeTo(null); 
     mainloadframe.setLayout(new GridLayout(1, 2)); 
     mainloadframe.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
     mainloadframe.setAlwaysOnTop(true); 
     mainloadframe.setTitle(operation); 
     mainloadframe.setVisible(true); 

     progressbar.setValue(0); 
     progressbar.setStringPainted(true); 
     loadpanel.add(progressbar); 
     loadpanel.add(operationlabel); 
     mainloadframe.add(loadpanel); 

    } 

    public void setMainScreen(MainScreen mainscreen) { 
     this.mainscreen = mainscreen; 
    } 

    public void disposeLoadFrame() { 
     mainloadframe.dispose(); 
    } 

    public void setProgress(int progress) { 
     this.progress = progress; 
    } 

    @Override 
    public void run() { 
     while (progress != 100) { 
      progressbar.setValue(progress); 
     } 
    } 
} 

進步的實際計算還處於完成線程,但出於某種原因,在圖像完成導入之前,進度條不會顯示在JFrame上。我很確定這是一個線程問題,但我似乎無法弄清楚。一點幫助,將不勝感激。

+0

UI更新調用progressbar.setValue(progress);對EDT的情況發生。從任何其他線程做到這一點是未定義的行爲,並導致任何東西從不穩定的繪圖,錯誤的控制彈出各地,正常工作,根本不工作。 – Joey 2013-05-10 14:04:57

回答

2
  • Runnable#Thread不是start()

  • (後到論壇)必須添加Thread.sleep(int)run(),然後progressbar.setValue(progress); MEST通過使用可運行util.Timer替代地被包裹成invokeLater()

  • #Thread,然後progressbar.setValue(progress); mest被包裹成invokeLater()


  • 使用Swing Timer

  • 正確的方式是從SwingWorker