最简单的基于JavaFX的MP3播放器

        JavaFX自带解码MP3文件功能,并且可以自由控制音量和播放进度。下面通过一个小例子实现此功能:

 注意:JDK8自带JavaFX组件,但JDK 11移除了JavaFX,请用JDK8运行以下代码。

import java.io.File;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Slider;
import javafx.scene.control.ToggleButton;
import javafx.scene.layout.VBox;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.stage.Stage;
import javafx.util.Duration;

public class JavaFXMP3Player extends Application {
	private Slider rollingSlider;// 播放进度滑动条
	private Slider soundSlider;// 音量滑动条
	private ToggleButton playButton;// 播放按钮
	private MediaPlayer player;// 播放器

	@Override
	public void start(Stage stage) throws Exception {
		/*
		 * 网络音频文件可以用以下方式创建连接对象
		 * java.net.URL mp3 = new java.net.URL("http://127.0.0.1:8080/demo.mp3");
		 */
		//被播放的MP3文件
		File mp3 = new File("F:\\demo.mp3");
		// MP3音频文件的媒体对象
		Media m = new Media(mp3.toURI().toString());
		// 创建播放此媒体对象的播放器
		player = new MediaPlayer(m);
		// 设置无限循环播放
		player.setCycleCount(MediaPlayer.INDEFINITE);
		// 带有选中状态的播放按钮
		playButton = new ToggleButton("播放");
		// 声音滚动条
		soundSlider = new Slider();
		// 最小音量是0
		soundSlider.setMin(0);
		// 最大音量是1
		soundSlider.setMax(1.0);
		// 音量滚动条与播放器音量绑定
		soundSlider.valueProperty().bindBidirectional(player.volumeProperty());
		// 进度滚动条
		rollingSlider = new Slider();
		// 进度滚动条与播放器进度绑定
		rollingSlider.valueProperty().bindBidirectional(player.audioSpectrumIntervalProperty());

		// 垂直箱式布局
		VBox root = new VBox(10);
		root.getChildren().add(playButton);
		root.getChildren().add(soundSlider);
		root.getChildren().add(rollingSlider);

		addEvent();// 组件添加事件

		// 创建场景
		Scene sc = new Scene(root, 150, 200);
		// 顶层窗口载入场景
		stage.setScene(sc);
		stage.show();
	}

	/**
	 * 组件添加事件
	 */
	private void addEvent() {
		// 当播放进度发生变化时
		player.currentTimeProperty().addListener(n -> {
			// 进度滚动条的值同步播放的秒数
			rollingSlider.setValue(player.getCurrentTime().toSeconds());
		});

		// 播放结束之后
		player.setOnEndOfMedia(() -> {
			playButton.setText("播放");// 更改按钮文本
			playButton.setSelected(false);// 按钮可用
			player.pause();// 暂停播放
		});

		// 播放按钮被点击时
		playButton.setOnAction(n -> {
			// 如果是选中状态
			if (playButton.isSelected()) {
				// 开始播放
				player.play();
				// 进度条最大值设为播放器的最大秒数
				rollingSlider.setMax(player.getStopTime().toSeconds());
				// 按钮文本改为暂停
				playButton.setText("暂停");
			} else {
				// 播放器暂停
				player.pause();
				// 恢复按钮的文本
				playButton.setText("播放");
			}
		});

		// 进度滚动条被鼠标按住
		rollingSlider.setOnMousePressed(n -> {
			// 将播放器的时间改为滚动条对应的值
			player.seek(new Duration(rollingSlider.getValue() * 1000));
		});

		// 进度滚动条被鼠标释放
		rollingSlider.setOnMouseDragged(n -> {
			// 将播放器的时间改为滚动条对应的值
			player.seek(new Duration(rollingSlider.getValue() * 1000));
		});
	}

	public static void main(String[] args) {
		launch();// 启动
	}
}

        运行之后的小窗口如下图所示,第一个滚动条是音量,第二个滚动条是进度条,鼠标可以随意拖拽这两个滚动条以实现控制播放效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值