0

これはjsliderを更新するための私のコードです

    try{
    name=(String) jList1.getSelectedValue();
    CanvasVideoSurface videoSurface = mediaPlayerFactory.newVideoSurface(canvas1);
    mediaPlayer.setVideoSurface(videoSurface);
    mediaPlayer.setAdjustVideo(true);        
    mediaPlayer.playMedia(name+".mp4");
    mediaPlayer.setVolume(jSlider1.getMinimum());
    mediaPlayer.parseMedia();
    time = (int)(mediaPlayer.getMediaMeta().getLength()/1000);
    jSlider2.setMaximum(time);
    while(jSlider2.getValue()<jSlider2.getMaximum())
    {
      jSlider2.setValue((int) this.mediaPlayer.getTime()/1000);
     }
    }
    catch(Exception e)
    {
     e.printStackTrace();
    }

スライダーの変更された状態の場合、これはコードです

 private void jSlider2StateChanged(javax.swing.event.ChangeEvent evt)
 {                                      
 mediaPlayer.setTime((long) this.jSlider2.getValue());
}                                     

しかし、それはノブの位置を変更しません。実際には、最初からもう一度再生し続けます。理由は、jslider が新しい値を取得する前に setTime() 関数が 0 に更新され続けるためだと思います。解決策はありますか? ? ありがとう!!

4

1 に答える 1

1

このコードで:

while(jSlider2.getValue() < jSlider2.getMaximum())
{
  jSlider2.setValue((int) this.mediaPlayer.getTime()/1000);
}

Swing Event D ispatch ThreadまたはEDTで実行時間の長いループを呼び出しているため、GUI がフリーズしてすべての描画が妨げられます。SwingWorker の doInBackground メソッドでバックグラウンド プロセスを実行してから、SwingWorker のパブリッシュ/プロセス メソッドのペアを介して GUI を更新することを検討してください。また、メディア プレーヤーをポーリングする場合は、ほぼ連続してポーリングするのは意味がないため、ポーリング ループの内側に入れることを検討してください。Thread.sleep(/* some number */)

詳細については、Swing での同時実行をご覧ください。

于 2013-07-07T11:47:35.987 に答える