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の回答も検討する必要があります。