2009-06-12 3 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

タイマー。 GUIはUIスレッドからのみ更新する必要があります。これを行うにはいくつかの方法があります。一番簡単なのは、AsyncTasksです。または、UIハンドラにイベントを送信しています。一部の関数は、nonGUIスレッドで呼び出されたときに機能しますが、それは十分に文書化されていません。私はリフレッシュ機能を見たことがありません。私は常にinvalidate(UIスレッド)またはpostInvalidate(バックグラウンドスレッド)を使用しています。私はsetTextがそれを内部的に呼び出すと思った。

関連する問題