2013-02-07 27 views
1

我試圖創建一個彈出對話框進度條,最好是不確定但這不是太重要。我一直在瀏覽「Oracle的ProgressBar教程」和谷歌搜索,但沒有這樣的運氣來實現它。我將我的代碼粘貼到Action Listener的下方,對話框不會彈出。有什麼建議麼?提前致謝!JProgressBar對話框

對不起,這是我在這個網站上的第一篇文章。但是它的工作原理是,當我按下創建按鈕時,它會出去,從不同的服務器和目錄中獲取一些信息,併爲我創建一個文件。這就是新項目的意義所在。功能是我創建的枚舉,在創建按鈕時使用JTextBox中的文本進行設置。問題是,這個過程需要時間來處理,所以我想一個進度條顯示,其處理

private class CreateButton implements ActionListener 
{ 
    @Override 
    public void actionPerformed(ActionEvent arg0) { 
     class Task extends SwingWorker<Void, Void> 
     { 
      @Override 
      protected Void doInBackground() 
      {     
       //Set Variables 
       for(Feature f : Feature.values()) 
       { 
        if(f.getComp() != null) 
        { 
         f.getVariable().setVariable(((JTextField) f.getComp()).getText()); 
        } 
       } 

       new Project(jobs.getSelectedValue().split("-")[0].trim(), 
          jobs.getSelectedValue().split("-")[1].trim(), 
          features); 
       return null; 
      } 
     } 

     ProgressMonitor pm = new ProgressMonitor(display, "Testing...", "", 0, 100); 
     pm.setProgress(0); 
     Task task = new Task(); 
     task.execute(); 
    } 

} 
+1

它是如何不起作用的? – Dan

+1

你在哪裏調用'setProgress()'? –

+0

進度條不會彈出 – bball

回答

0

這來自於甲骨文的javadoc ProgressMonitor:

最初,沒有ProgressDialog。在第一個毫秒後確定毫秒(默認值500)之後,進度監控器 將預測該操作需要多長時間。如果它長於 millisToPopup(默認2000,2秒),則會彈出一個ProgressDialog對話框 。

請注意,創建它之前至少要等1/2秒纔會彈出。即使這樣,如果預計這個過程需要2秒鐘以上,它也只會彈出。

這是基於您對setProgress(int)的重複調用以及您在給定值範圍內的值之間的時間間隔。

我懷疑導致對話框彈出的條件沒有得到滿足。或者,也許你的程序會在這段時間過去之前退出。

0

您需要定義屬性

ProgressMonitor pm; 

那麼應該創建總進度大小

int totalProgress = Feature.values().size(); 

然後在循環只是增量次數

int counter = 0; 
for(Feature f : Feature.values()) 
{ 
    if (pm.isCanceled()) { 
    pm.close(); 
    return null; 
    } 
    pm.setProgress(counter); 
    pm.setNote("Task is " + counter*100/totalProgress + "% completed"); 
    counter++; 

調用進度監視器

pm = new ProgressMonitor(display, "Testing...", "", 0, totalProgress); 

假定大部分工作是在循環中完成的,如果項目創建等其他部分需要時間,則可以在功能完成後向totalProgress添加額外的百分比計數或重置監視器。

1

我不確定你的SSCCE,所以我只是發帖如何JProgressBar通常工作。

閱讀SwingWorkerJProgressBar

在後臺進程顯示進度條。顯示了一個簡單的例子。

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JProgressBar; 
import javax.swing.SwingWorker; 

public class MyProgressBarTest { 
    private static final long serialVersionUID = 1L; 

    private static JProgressBar progressBar; 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
      MyProgressBarTest obj = new MyProgressBarTest(); 
      obj.createGUI(); 
     } 
    }); 
    } 

    public void createGUI() { 
     final JFrame frame = new JFrame(); 

     JPanel panel = new JPanel(); 
     final JButton button = new JButton("Progress"); 

     progressBar = new JProgressBar(); 

     button.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent arg0) { 

       MyCustomProgressBarDialog progressBarObj = new MyCustomProgressBarDialog(progressBar, frame); 
       progressBarObj.createProgressUI(); 

       MyActionPerformer actionObj = new MyActionPerformer(progressBar, progressBarObj, button); 
       actionObj.execute(); 

      } 
     }); 

     panel.add(button); 
     frame.add(panel); 

     frame.setTitle("JProgressBar Example"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationRelativeTo(null); 
     frame.setSize(200, 300); 
     frame.setVisible(true); 
    } 
} 

class MyActionPerformer extends SwingWorker<String, Object> { 

    JProgressBar fProgressBar; 
    MyCustomProgressBarDialog progressDialog; 
    JButton button; 

    public MyActionPerformer(JProgressBar progressBar, MyCustomProgressBarDialog progressDialog, JButton button) { 
     this.fProgressBar = progressBar; 
     this.fProgressBar.setVisible(true); 
     this.fProgressBar.setIndeterminate(true); 
     this.button = button; 
     this.progressDialog = progressDialog; 

     this.button.setEnabled(false); 
    } 

    protected String doInBackground() throws Exception { 

     calculateResult(); 
     return "Finished"; 
    } 

    protected void done() { 
     fProgressBar.setVisible(false); 
     this.progressDialog.setVisible(false); 
     this.button.setEnabled(true); 
    } 

    public void calculateResult() { 
     for (int i = 0; i < 500000; i++) { 
      System.out.println("Progress Bar: " + i); 
     } 
    } 
} 

class MyCustomProgressBarDialog extends JDialog { 
    private static final long serialVersionUID = 1L; 

    private static JProgressBar progressBar; 
    private JFrame motherFrame; 
    private JLabel label = new JLabel("loading.. "); 
    private JButton button; 

    public MyCustomProgressBarDialog(JProgressBar progressBar, JFrame frame) { 

     this.progressBar = progressBar; 
     this.motherFrame = frame; 
     this.button = button; 
    } 

    public void createProgressUI() { 
     add(label, BorderLayout.NORTH); 
     add(progressBar, BorderLayout.CENTER); 
     setSize(50, 40); 
     setAlwaysOnTop(true); 
     setLocationRelativeTo(motherFrame); 
     setUndecorated(true); 
     setVisible(true); 
    } 
}