2014-06-09 3 views
1

진행 막대를 사용하여 기본 JDialog를 만들고 일부 작업이 완료되면 막대를 업데이트하려고합니다.스윙 ProgressBar가 항상 업데이트되지 않는 경우

public class Main { 

public static void main(String[] args) { 

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

와 : 내 코드는 내가 프로그램을 실행하고 createDoc 버튼을 클릭하면

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); 
} 

가 진행 표시 줄이 대화 상자에서 업데이트되지 않습니다,하지만 난 대화 상자를 닫고 경우를 클릭합니다 버튼을 다시 누르면 진행률 표시 줄이 업데이트됩니다. 이벤트 디스패치 스레드와 관련된 것이지만 항상 바를 업데이트하기 위해 코드를 변경하는 방법을 알지 못합니다.

나는 또한 SwingWorker를 사용해 보았지만 성공하지 못했습니다.

답변

0

스레드를 시작한 후에 JDialog이 표시되도록하십시오.

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

사용 Swing Timer 대신 스윙 응용 프로그램에 더 적합 Java Timer.

How to Use Swing Timers

+0

제안을 주셔서 감사합니다,하지만이 시간을 읽고, 내가 처음으로 버튼을 누를 때 진행률 표시 줄 만 업데이트하는 ... – mawus

+0

그것은 그것뿐만 아니라 첫 번째 클릭에 일하고 그 원래이었다 의미 발행물. – Braj

+1

버튼을 누를 때마다 진행 막대가 작동합니다. 첫 번째 문제는 첫 번째 클릭을 업데이트하지 않는 것이 었습니다. 이제 첫 번째 클릭에서만 작동합니다. – mawus