簡體   English   中英

更新JProgressBar

[英]Update 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();

進度條狀態僅在線程結束時更新。 有人能幫我嗎??

在睡眠之前,添加對SwingUtilties.invokeLater()的調用,該調用產生一個線程以在EDT中的進度條上觸發firePropertyChange。

直接使用模型而不是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();
}

對您的情況最好的建議是使用SwingWorker 查看API, 網址http://java.sun.com/javase/6/docs/api/javax/swing/SwingWorker.html

覆蓋進程方法以更新進度條的值(然后它將在EDT上正確完成)

有關更多信息,請訪問http://java.sun.com/products/jfc/tsc/articles/threads/threads2.html

對於eugener來說, SwingWorker絕對是您想要在這里使用的,或者任何時候產生長時間運行的任務,否則可能會在完成之前鎖定您的GUI。 Sun ^ H ^ H ^ HOracle提供了有關使用SwingWorker進度條的完整教程:

http://java.sun.com/docs/books/tutorial/uiswing/components/progress.html

謝謝大家。 我這樣解決了

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
   }

把這個片段

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

在'i ++'和'Thread.sleep()'之間應該完成這項工作。 要進行編譯,請將jProgBar標記為“final”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM