2014-06-09 71 views
1

我想用進度條創建一個基本的JDialog,並在完成某些操作時更新該欄。我的代碼是:Swing ProgressBar並不總是更新

public class Main { 

public static void main(String[] args) { 

    WikiReaderUI ui = new WikiReaderUI(); 
    SwingUtilities.invokeLater(ui); 
}} 

和:

public class WikiReaderUI implements Runnable { 

private JFrame frame; 
protected Document doc; 
protected JProgressBar progressBar; 
protected int progress; 

@Override 
public void run() { 
    frame = new JFrame("Wiki READER"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    // Set up the content pane. 
    addComponentsToPane(frame.getContentPane()); 

    // Display the window. 
    frame.setSize(600, 320); 
    frame.setResizable(false); 
    frame.setVisible(true); 

} 

private void addComponentsToPane(Container pane) { 
    pane.setLayout(new BoxLayout(pane, BoxLayout.Y_AXIS)); 
    addLanguagePanel(pane); 
    //other panels...irelevant for my problem 
    addCreationPanel(pane); 
} 

private void addCreationPanel(Container pane) { 
    JPanel infoPanel = new JPanel(); 
    infoPanel.setLayout(new GridBagLayout()); 
    GridBagConstraints c = new GridBagConstraints(); 
    c.ipady = 5; 
    JButton createDoc = new JButton("Create PDF"); 
    createDoc.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      JDialog dlg = new JDialog(frame, "Progress Dialog", true); 
      progressBar = new JProgressBar(0, 500); 
      progressBar.setOpaque(true); 
      dlg.add(BorderLayout.CENTER, progressBar); 
      dlg.add(BorderLayout.NORTH, new JLabel("Progress...")); 

      dlg.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
      dlg.setSize(300, 75); 
      dlg.setLocationRelativeTo(frame); 
      dlg.setVisible(true); 

      Thread t = new Thread(new Runnable() { 

       @Override 
       public void run() { 
        while (progress < 500) { 
         progressBar.setValue(progress); 
         progress++; 
         try { 
          Thread.sleep(10); 
         } catch (InterruptedException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 
        } 
       } 
      }); 
      t.start(); 
     } 
    }); 

    infoPanel.add(createDoc, c); 
    pane.add(infoPanel); 
} 

當我運行該程序,並單擊createDoc按鈕,沒有更新進度條的對話框中,但如果我關閉對話框,然後點擊按鈕,進度條正在更新。我知道這是與事件調度線程有關的事情,但我不知道如何更改我的代碼,以便始終更新欄。

我也試過用SwingWorker,沒有成功。

回答

0

使JDialog在啓動線程後可見。

t.start(); 
dlg.setVisible(true); 

使用Swing Timer而不是Java Timer更適合與Swing應用程序。

更多How to Use Swing Timers

+0

感謝的建議,但是這一次,當我按下按鈕,第一次進度條只更新... – mawus

+0

這意味着它的工作首先點擊,以及那是你的原問題。 – Braj

+1

每次按下按鈕時進度條都應該有效。我的第一個問題是,它沒有在第一次點擊更新。現在它只能在第一次點擊時工作 – mawus