2010-07-04 65 views
2

我不能更新我的进度......这是我的代码更新的JProgressBar

Thread t=new Thread(new Runnable(){ 
     public void run(){ 
      int i=1; 
      jProgBar.setMinimum(0); 
      jProgBar.setMaximum(100); 
      try { 
       while(i<=100 || true){ 
        jProgBar.setValue(i); 
        i++; 
        Thread.sleep(50); 
       } 
      } 
      catch (InterruptedException ex){ 
       jProgBar.setValue(jProgBar.getMaximum()); 
      } 
     } 
    }); 
    t.start(); 

    .... Something code that correctly works 

    t.interrupt(); 

进度条状态仅在线程结束时更新。 有人可以帮助我吗?

回答

1

谢谢大家。 我解决了是的,这是根据这一原则,即对各部的状态的任何变化应该从事件指派线程来完成这样

try{ 
     jProgBar.setIndeterminate(true); 
     jProgBar.setStringPainted(true); 
     jProgBar.setBorderPainted(true); 
     new Thread(new Runnable() { 
      public void run() { 
       ... 
       // here is code that i've to wait 
       // after this i stop my jProgressBar 
       ... 
       jProgBar.setStringPainted(false); 
       jProgBar.setBorderPainted(true); 
       jProgBar.setIndeterminate(false); 
     } 
     }).start(); 
    } 
    catch(IllegalStateException ex){ 
     //some code 
    } 
4

在睡觉之前,向SwingUtilties.invokeLater()添加一个调用,该调用产生一个线程来触发EDT中的进度条上的firePropertyChange。

+0

。 Swing显然是以这种方式设计的(单线程)以避免太复杂。任何来自外部的呼叫都可能导致潜在的相互阻挡。我的理解是,invokeLater()将一个调用放置在某种执行队列的末尾。 – 2010-07-04 13:48:22

3

使用而获得的模型,而不是直接JProgressBar的:

DefaultBoundedRangeModel model = new DefaultBoundedRangeModel(); 
JProgressBar bar = new JProgressBar(model); 

// Somewhere else, perhaps in another Thread 
model.setValue(i) 

下面的示例正常工作:

public static void main(String[] args) throws InterruptedException { 
    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(200, 100); 
    frame.setVisible(true); 
    final DefaultBoundedRangeModel model = new DefaultBoundedRangeModel(); 
    frame.add(new JProgressBar(model)); 
    Thread t = new Thread(new Runnable() { 
     public void run() { 
      int i = 1; 
      model.setMinimum(0); 
      model.setMaximum(100); 
      try { 
       while (i <= 100 || true) { 
        model.setValue(i); 
        i++; 
        Thread.sleep(50); 
       } 
      } catch (InterruptedException ex) { 
       model.setValue(model.getMaximum()); 
      } 
     } 
    }); 
    t.start(); 

    Thread.sleep(2000); 

    t.interrupt(); 
} 
+2

除非他在美国东部时间这样做,否则它不会起作用。 – 2010-07-04 18:57:37

+0

是的,它的工作原理。请参阅JDK1.6.0_20中的BasicProgressBarUI行1226-1229,该行发出repaint(),从而生成Toolkit.getEventQueue()。postEvent(e); – mhaller 2010-07-04 19:06:48

0

把这个片段

SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     jProgBar.repaint(); 
    } 
} 

'我++' 和“的Thread.sleep之间( )'应该完成这项工作。为了让它编译,将jProgBar标记为'final'。