【问题标题】:How to pause/resume a song in javafx?如何在 javafx 中暂停/恢复歌曲?
【发布时间】:2015-04-08 18:19:18
【问题描述】:

我正在使用 javafx 制作一个基于播放列表的 mp3 播放器,除了如何暂停/恢复歌曲外,我一切正常。我尝试简单地检查player.Status()并使用它,但它不起作用,所以我将点击pause()时的歌曲时间存储在Duration pausetime变量中,它以这种方式工作但只有一次。发生的情况是:我点击pause(),它工作,点击play(),它恢复歌曲,但之后暂停按钮停止执行任何操作。

顺便说一句,由于我想要的风格,我使用两个单独的 ToggleButton 来暂停和播放。

这是我正在谈论的代码部分:

public void play(){
    if (player != null){
        player.stop();
    }
    if (pausebutton.isSelected()){
        pausebutton.setSelected(false);            //resume part
        slider.setValue(pausetime.toSeconds());
        play();
    }
    this.player = players.get(i);
    player.setStartTime(pausetime);
    player.play();
    slide(i);
    csong.setText(playlist.get(i).getName());
    player.setOnEndOfMedia(new Runnable(){
        @Override public void run(){
    if (shuffle.isSelected()){
        i = rand.nextInt(players.size() + 1);
    }
    else{
        i++;
    }
    if(loop.isSelected()){
    if (i == players.size()){
        i = 0;
    }}
    list.getSelectionModel().select(i);
    play();
            }
    });
}

public void pause(){
    player.pause();
    pausetime = player.getCurrentTime();
    playbutton.setSelected(false);
}

【问题讨论】:

    标签: java javafx media-player


    【解决方案1】:

    我创建了一个非常简单的 mp3 播放器,它具有上述大部分(如果不是全部)组件。

    • 它有播放和暂停切换按钮,可以正常工作;)
    • 标签会更新歌曲经过的时间
    • 它有一个滑动条,可以用来向前/向后移动。它会在歌曲播放时自动更新。

    完整代码

    import javafx.application.Application;
    import javafx.beans.property.DoubleProperty;
    import javafx.beans.value.ChangeListener;
    import javafx.beans.value.ObservableValue;
    import javafx.geometry.Pos;
    import javafx.scene.Scene;
    import javafx.scene.control.*;
    import javafx.scene.layout.HBox;
    import javafx.scene.layout.Priority;
    import javafx.scene.layout.StackPane;
    import javafx.scene.layout.VBox;
    import javafx.scene.media.Media;
    import javafx.scene.media.MediaPlayer;
    import javafx.stage.Stage;
    import javafx.util.Duration;
    
    import java.text.DecimalFormat;
    
    public class MediaPlayerSample extends Application {
    
        private MediaPlayer player;
        private final ToggleButton playButton = new ToggleButton("Play");
        private final ToggleButton pauseButton = new ToggleButton("Pause");
        private final ToggleGroup group = new ToggleGroup();
        private final Label totalDuration = new Label();
        private final Label currentDuration = new Label();
        private final DecimalFormat formatter = new DecimalFormat("00.00");
        private final SliderBar timeSlider = new SliderBar();
        private Duration totalTime;
    
        @Override
        public void start(Stage primaryStage)
        {
            //Add a scene
            VBox root = new VBox(10);
            root.setAlignment(Pos.CENTER);
            root.setStyle("-fx-background-color: ANTIQUEWHITE");
    
            HBox playPause = new HBox(playButton, pauseButton);
            HBox sliderBox = new HBox(timeSlider, currentDuration, totalDuration);
    
            HBox.setHgrow(sliderBox, Priority.ALWAYS);
    
            root.getChildren().addAll(sliderBox, playPause);
            Scene scene = new Scene(root, 300, 100);
    
            Media pick = new Media(getClass().getResource("/delete/abc/abc.mp3").toExternalForm());
            player = new MediaPlayer(pick);
    
            // Play the track and select the playButton
            player.play();
            playButton.setSelected(true);
    
    
    
            player.currentTimeProperty().addListener(new ChangeListener<Duration>() {
                @Override
                public void changed(ObservableValue<? extends Duration> observable, Duration oldValue, Duration newValue) {
                    timeSlider
                            .sliderValueProperty()
                            .setValue(newValue.divide(totalTime.toMillis()).toMillis() * 100.0);
                    currentDuration.setText(String.valueOf(formatter.format(newValue.toSeconds())));
                }
            });
    
            player.setOnReady(() -> {
                // Set the total duration
                totalTime = player.getMedia().getDuration();
                totalDuration.setText(" / " + String.valueOf(formatter.format(Math.floor(totalTime.toSeconds()))));
            });
    
            // Slider Binding
            timeSlider.sliderValueProperty().addListener((ov) -> {
                if (timeSlider.isTheValueChanging()) {
                    if (null != player)
                        // multiply duration by percentage calculated by
                        // slider position
                        player.seek(totalTime.multiply(timeSlider
                                .sliderValueProperty().getValue() / 100.0));
                    else
                        timeSlider.sliderValueProperty().setValue(0);
                }
            });
    
    
            //Applying Toggle Group to Buttons
            playButton.setToggleGroup(group);
            pauseButton.setToggleGroup(group);
    
            // Action for Buttons
            playButton.setOnAction(e -> {
                play();
            });
    
            pauseButton.setOnAction(e -> {
                pause();
            });
    
            //show the stage
            primaryStage.setTitle("Media Player");
            primaryStage.setScene(scene);
            primaryStage.show();
    
    
        }
    
        public void play(){
            player.play();
            playButton.setSelected(true);
        }
    
        public void pause(){
            player.pause();
            playButton.setSelected(false);
        }
    
    
        private class SliderBar extends StackPane {
    
            private Slider slider = new Slider();
    
            private ProgressBar progressBar = new ProgressBar();
    
            public SliderBar() {
                getChildren().addAll(progressBar, slider);
                bindValues();
            }
            private void bindValues(){
                progressBar.prefWidthProperty().bind(slider.widthProperty());
                progressBar.progressProperty().bind(slider.valueProperty().divide(100));
            }
    
            public DoubleProperty sliderValueProperty() {
                return slider.valueProperty();
            }
    
            public boolean isTheValueChanging() {
                return slider.isValueChanging();
            }
        }
        public static void main(String[] args) {
            launch(args);
        }
    }
    

    播放时的简单外观

    您可以使用stylesheet 设置媒体播放器的样式。您可以通过JavaFX CSS Reference 了解有关 css 的高级主题。

    对于具有以下高级功能的媒体播放器:

    • 将歌曲添加到播放列表
    • 一首一首歌曲播放
    • 将歌曲拖放到 mediaview 中

    还有更多,您可以访问this example

    【讨论】:

      猜你喜欢
      • 2012-08-16
      • 1970-01-01
      • 2015-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-04
      相关资源
      最近更新 更多