2009-06-12 8 views
1

비디오 녹화를위한 응용 프로그램을 만들고 비디오 미리보기를 txtStatustxtTime 레이블로 덮어 썼습니다.GUI 업데이트를위한 타이머 사용 : 왜 작동하지 않습니까?

카메라 버튼은 주기적으로 UpdateGUI 메서드를 호출하는 타이머를 시작/중지합니다. 디버그를 실행하면 타이머가 작동하는 것을 볼 수 있습니다 - 매초 updateGUI 메서드를 호출하지만 메서드는 컨트롤을 업데이트하지 않습니다.

이 문제를 해결하는 방법에 대한 힌트를 얻을 수 있다면 정말 고마워 할 것입니다.

private void startTimer() 
{ 
    updateTimer = new Timer("TimerUpdate"); 
    updateTimer.scheduleAtFixedRate(new TimerTask(){ 
     public void run(){ 
      settings.IncreaseRecordingTime(); 
      updateGUI(); 

     } 
    }, 0, 1000); 
} 

이것은 updateGUI 방법입니다 :

private void updateGUI() 
{ 
    setStatusLabel(); 
    String strTime = settings.GetTimerString(); //strTime changes every second (it works as expected) 
    txtTimer.setText(strTime);//the text doesn't change! 
} 

그리고이 호출되는 방법이 타이머를 활성화하는 방법은

: 여기

코드입니다 버튼을 눌렀을 때 :

private boolean onCaptureButton() 
{ 
    settings.CaptureAction(); 
    videoPreview.setFrameCallback(settings); 
    updateGUI();//here the function updateGUI() works as expected - it changes the txtStatus text from "Preview" to "Recording" 
    setTimer(); 
    return false; 
} 

덧글을 덧붙여서 onCaptureButton() 메서드에서 호출 할 때 updateGUI()이 작동하는 이유를 모르거나 타이머 메서드 내에서 호출 할 때 작동하지 않습니다.

답변

0

각 컨트롤 호출 control.Refresh() 또는 form.Refresh()을 업데이트 한 후에는 컨트롤이 즉시 다시 그려집니다. 귀하의 경우에는

는 :

txtTimer.setText(strTime); // the text doesn't change! 
txtTimer.Refresh(); 
+0

txtTimer.refreshDrawableState();를 사용하려고했습니다. 하지만 작동하지 않습니다. –

3

타이머는 타이머 스레드에서 실행됩니다. UI 스레드에서만 GUI를 업데이트해야합니다. 이 작업에는 몇 가지 방법이 있습니다. 가장 쉬운 방법 중 하나는 AsyncTasks이거나 UI 처리기에 이벤트를 게시하는 것입니다. 일부 함수는 nonGUI 스레드에서 호출 될 때 작동하지만 잘 설명되지 않습니다. 나는 새로 고침 기능을 본적이 없다. 나는 항상 무효화 (UI 스레드) 또는 postInvalidate (백그라운드 스레드)를 사용했습니다. 그 setText 그 내부적으로 생각하지만 생각.

관련 문제