3

JMFを使ってメディアプレーヤーを作っています。自分のコントロールコンポーネントを使いたいです。スライダーの位置に合わせて曲を再生できるように、メディアプレーヤーのシークバーを作ってください。

ロジックを提案してください。後でコーディング部分を理解できます。

if(player!=null){
    long durationNanoseconds = 
    (player.getDuration().getNanoseconds());
    durationbar.setMaximum((int) player.getDuration().getSeconds());
    int duration=(int) player.getDuration().getSeconds();
    int percent = durationbar.getValue();
    long t = (durationNanoseconds / duration) * percent;
    Time newTime = new Time(t);
    player.stop();
    player.setMediaTime(newTime);
    player.start();
    mousedrag=true;

これがコードです。スライダーを曲に合わせて動かすにはどうすればよいですか?スライダーはドラッグ/クリックすると機能しますが、曲と一緒に移動しません。

4

3 に答える 3

7

これにスライダーを使用する場合の問題は、スライダーの位置をプログラムで移動すると、イベントが発生することです。イベントがスライダーで発生する場合、それは通常、アプリを意味します。曲の位置を移動するなど、何かをする必要があります。効果は無限ループです。フラグを設定し、いくつかのイベントを無視することでこれを回避する方法はおそらくありますが、私は別の方法をとることにしました。

代わりに、を使用JProgressBarしてトラック内の場所を示し、MouseListenerユーザーが別の位置をクリックしたことを検出するためにを使用しました。プログレスバーを更新するには、Timer50〜200ミリ秒ごとにトラックの位置をチェックするSwingを使用します。aMouseEventが検出されたら、トラックの位置を変更します。

このGUIの右上にバーが表示されます。その上にカーソルを合わせると、そのマウス位置でのトラックの時間を示すツールチップが生成されます。

トラックの位置にプログレスバーを使用するデュークボックス

于 2012-10-08T23:32:05.730 に答える
3

JSliderを使用できます。

Sliderチュートリアルから詳細を学ぶことができます

スライダーチュートリアル

于 2012-10-08T17:14:28.670 に答える
1

revalidateスライダーを変更するためにコンテナーを変更する必要はありません。

新しいプレーヤーが作成されるたびに、次の行を使用します。

  slider.setMinimum(0);
  slider.setMaximum(duration);
  slider.setValue(0);

  new UpdateWorker(duration).execute();

ここdurationで、は曲の長さを秒単位で保持する変数です。

そして、スライダーを更新するコード(内部クラスとして使用)は次のとおりです。

private class UpdateWorker extends SwingWorker<Void, Integer> {

    private int duration;

    public UpdateWorker(int duration) {
        this.duration = duration;
    }

    @Override
    protected Void doInBackground() throws Exception {
        for (int i = 1; i <= duration; i++) {
            Thread.sleep(1000);
            publish(i);
        }
        return null;
    }

    @Override
    protected void process(List<Integer> chunks) {
        slider.setValue(chunks.get(0));
    }

}

これで、スライダーは曲の終わりまで右に移動します。

また、カスタムスライダーを使用する場合を除いて、JMFは単純な(そして機能する)スライダーを経由して提供することにも注意してください(この例player.getVisualComponent()を参照)。

アップデート

ワーカースレッド(したがってスライダーと曲)を一時停止/再開するために、適切なフラグを設定するボタンを使用した例を次に示します。

private boolean isPaused = false;
JButton pause = new JButton("Pause");
pause.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        JButton source = (JButton)e.getSource();
        if (!isPaused) {
            isPaused = true;
            source.setText("Resume");
        } else {
            isPaused = false;
            source.setText("Pause");
        }
    }
});

メソッドは次のdoInBackgroundように変更する必要があります。

@Override
protected Void doInBackground() throws Exception {
    for (int i = 0; i <= duration; i++) {
        if (!isPaused) {
            publish(i);
            try {
                Thread.sleep(1000);
            } catch(InterruptedException e) {
                e.printStackTrace();
            }
        }
        while (isPaused) {
            try {
                Thread.sleep(50);
                continue;
            } catch(InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    return null;
}

それに応じて変更し、スライダーと一緒に曲を一時停止/再開します。

@AndrewThompsonの回答も検討する必要があります。

于 2012-10-08T21:34:41.950 に答える