2017-02-19 7 views
-2

swingList를 사용하여 코드를 작성했습니다. actionListener를 추가하면 progressBar가 업데이트되지 않습니다.java swing progressBar

버튼 및 액션 리스너가 없어도 효과적입니다. progressBar 업데이트를 가능한 간단하고 깔끔하게 만드는 방법? 첨부 된 코드는 내 문제를 요약 한 이해하기 쉬운 예제입니다. ActionPerformed 메소드를 주석 처리하고 main에서 프로그램을 실행하면 잘 작동합니다.

설명하지 않고 코드를 붙여 넣기 만하면 안됩니다. 나는이를 보았다 :

추신 : swing progressBar threading

public class Okno { 

    private JProgressBar progressBar = new JProgressBar(0,306); 
    JFrame f = new JFrame("JProgressBar Sample"); 
    JButton b = new JButton("start"); 
    ActionListener a = new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      barupdate(); 
     } 
    }; 


    private void barupdate(){ 
     for(int p = 1; p<308;p=p+2){ 
      System.out.println(p); 

      progressBar.setValue(p); 

       try { 
         Thread.sleep(50); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
     } 
} 

private Okno(){ 

    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    progressBar.setStringPainted(true); 

    f.add(progressBar, BorderLayout.SOUTH); 
    f.add(b, BorderLayout.NORTH); 
    b.addActionListener(a); 
    f.setSize(300, 300); 
    f.setVisible(true); 

} 

public static void main(String[] args) { 
    Okno okno = new Okno(); 
} 
} 
+0

이것은 일반적으로 같은 방식으로 해결되는 매우 일반적인 문제입니다.이 경우 가장 좋은 해결책은 일반적으로 [SwingWorker]를 사용하는 것입니다 (예 : http://stackoverflow.com/questions/12020949/jprogressbar-isnt). -progressing/12021971 # 12021971). 또한이 문제에 대한 자세한 내용은 [동시성 (Concurrency in Swing)] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)을 참조하십시오. 대부분의 경우 Swing은 쓰레드에 안전하지 않고 UI를 업데이트하기 위해 별도의 예방 조치를 취해야하기 때문에 다른'Thread'를 사용하는 것이 최선의 방법은 아닙니다. SwingWorker가 무료로 제공합니다.) – MadProgrammer

+0

@ MadProgrammer,'이 경우 가장 좋은 해결책은 보통 SwingWorker를 사용하는 것입니다 ... 당신은 Swing에서 Concurrency를 봐야합니다. '- 내가 생각하기를 바란다. – camickr

+0

@camickr 질문은 닫아야하지만 사람들과 문제가 있다는 것을 알고 있으므로 내 의견을 남기고 (대답을 지원하는) – MadProgrammer

답변

1

문제는 당신이 당신이 액션 청취자로부터 호출되고 진행률 표시 줄 설정을 조정하고 루프를 가지고있다. 문제는 청취자가 끝날 때까지 바가 업데이트되지 않는다는 것입니다. 그래서 업데이트를 얻지 못할 것입니다. 뿐만 아니라 당신이 그 행동 청취자에있을 때 창문이 마우스 클릭 등에 반응 할 수 없기 때문에 당신은 GUI를 습격 할 것입니다.

이렇게 처리하는 가장 좋은 방법은 액션 리스너에 스윙 타이머를 만들고 버튼을 업데이트하기위한 코드를 삽입 한 다음 액션 리스너에서 타이머를 시작하는 것입니다.

타이머는 막대를 한 번만 업데이트해야합니다. 스윙 타이머가 여러 번 호출되어 반복성의 일부를 재생한다는 사실을 허용해야합니다. 따라서 코드에 루프를 넣고 싶지는 않습니다.

+0

방향으로 나를 가리키는 주셔서 감사합니다 ... 어떻게 갔다 코드를 게시 할 것입니다 –

0
Thread.sleep(50); 

Thread.sleep (...)을 사용하지 마십시오. 이렇게하면 루프 실행이 완료 될 때까지 GUI가 다시 칠하는 것을 방지 할 수 있습니다.

대신 SwingWorker을 사용할 수 있습니다.

Concurrency in Swing의 스윙 튜토리얼의 섹션을 읽고 자세한 정보가 나와 있으며 작동 예제에는 SwingWorker이 포함되어 있습니다.

또한 튜토리얼 목차를 살펴보십시오. 작업 예제가 들어있는 How to Use ProgressBars 섹션이 있습니다. 튜토리얼은 예제를 찾는 첫 번째 장소입니다.

+0

코드를 내 문제를 요약하는 예제입니다 및 sleep() 메서드는 그냥 프로 그라스 바 느린 진행률을 만들 수 있습니다. actionlistening 코드를 제거하고 main에서 progressbar 코드를 시작하면 잘 동작합니다. –

+0

알아. main()에서 진행률 표시 줄을 시작하면 코드가 다른 스레드에서 실행됩니다. ActionListener에서 진행 막대를 시작하면 코드를 GUI를 그리는 Thread 인 'Event Dispatch Thread (EDT)'에서 실행합니다. 따라서 별도의 Thread에서 진행 막대를 시작해야합니다. Swing이 어떻게 작동하는지 더 잘 이해하기 위해 튜토리얼을 읽어야합니다. '자습서에는 실습 예제가 있습니다 .' – camickr