2017-11-20 6 views
0

0에서 850000까지의 for 루프를 만들었습니다. 결과를 사용하여 업데이트 할 진행률 막대를 만들기 때문에 높은 숫자를 선택했습니다 for 루프에서. 지금까지 가지고있는 코드는 다음과 같습니다.진행 표시 줄을 작성하여 for 루프에서 결과를 업데이트하십시오.

public class ProgressBarTest extends JFrame { 

    private JPanel contentPane; 

    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 





     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        ProgressBarTest frame = new ProgressBarTest(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the frame. 
    */ 
    public ProgressBarTest() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 450, 300); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     contentPane.setLayout(new BorderLayout(0, 0)); 
     setContentPane(contentPane); 

     for(int i = 850000; i>0; i--) { 
      System.out.println("i = " + i); 
     } 

    } 

} 

for 루프를 사용하여 진행률 표시 줄을 업데이트하는 방법을 찾지 못하는 것 같습니다. 나는 타이머에서 작동하는 진행 바를 만들었지 만, 내가 원하는 바가 아니다. 기본적으로 0 %에서 100 %로 업데이트하고 싶습니다. 이것은 나에게 단순 해 보이지만 나는 그것에 잠시 붙어있다. 어떻게 작동하는지 이해하는 데 도움이되는 샘플 코드에 감사드립니다.

+5

사용 SwingWorker의, doInBackground()에 의해 제안 된 SwingWorker를 사용하고 게시, 완전한 예이다(). – Saran

+0

감사합니다. 이것은 나에게 큰 도움이되었습니다. –

답변

3

가 여기에 Saran

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.util.List; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JProgressBar; 
import javax.swing.SwingWorker; 
import javax.swing.border.EmptyBorder; 

public class ProgressBarTest extends JFrame { 

    private static final long LOOP_LENGTH = 85000000; 

    private JPanel contentPane; 

    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 

     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        ProgressBarTest frame = new ProgressBarTest(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the frame. 
    */ 
    public ProgressBarTest() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 450, 300); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     contentPane.setLayout(new BorderLayout(0, 0)); 
     JProgressBar progress = new JProgressBar(); 
     progress.setStringPainted(true); 
     contentPane.add(new JLabel("Loop progress is: "), BorderLayout.NORTH); 
     contentPane.add(progress, BorderLayout.SOUTH); 
     setContentPane(contentPane); 
     ProgressWorker worker = new ProgressWorker(progress); 
     worker.execute(); 
    } 

    private static class ProgressWorker extends SwingWorker<Void, Integer> { 
     private final JProgressBar progress; 

     public ProgressWorker(JProgressBar progress) { 
      this.progress = progress; 
     } 

     @Override 
     protected Void doInBackground() throws Exception { 
      for (long i = LOOP_LENGTH; i > 0; i--) { 
       final int progr = (int) ((100L * (LOOP_LENGTH - i))/LOOP_LENGTH); 
       publish(progr); 
      } 
      return null; 
     } 

     @Override 
     protected void process(List<Integer> chunks) { 
      progress.setValue(chunks.get(chunks.size() - 1)); 
      super.process(chunks); 
     } 

     @Override 
     protected void done() { 
      progress.setValue(100); 
     } 
    } 
} 
+0

감사합니다. 이것은 완벽하게 작동하며 진행 막대가 어떻게 작동하는지 더 잘 이해합니다. –

2

SwingWorker를 사용해야합니다. Swing 프로그램이 장기 실행 작업을 실행해야 할 때 대개 작업자 스레드 중 하나를 사용합니다. 이처럼), 클래스에

public class JProgressBarTest extends SwingWorket<Void,Integer>{ 

private JProgressBar jpb; 
    public ProgrssBarTest(JProgressBar jpb){ 
    this.jpb = jpb; 
    } 

    @Override 
    protected void process(List<Integer> chunks){ 
    int i = chunks.get(chunks.size()-1); 
    jpb.setValue(i); 
    } 

    @Override 
    protected void doInBackground() throws Exception{ 
    int x = 0; 
    for(int i = 850000; i>0; i--) { 
     publish(x); //replace x with the number you want to increment the progressbar each time pubish is called 
     x = x + i; //or replace i with the increment you want 
     System.out.println("i = " + i); 
    } 
    } 

    @Override 
    protected void done(){ 
    try{ 
     get(); 
    }catch(ExecutionException |InterruptedException e){ 
     ; 
    } 
    } 

} 

.Execute를 (나는 위의 새로운 JProgressBar가을 (를 통과 쓴 클래스의 새로운 클래스를 호출) 및 추가하여 루프를 대체 : 그래서,이 시도

new JProgressBarTest(new JProgressBar()).execute(); 
+0

이것은 우수합니다. 나는 Sergiy Medvynskyy의 대답을 사용했지만, 나는 당신이 매번 진도 표시 줄을 얼마나 많이 늘릴 지 선택할 수 있다는 사실을 좋아하기 때문에 앞으로 언젠가 이것을 사용할 수도 있습니다. –