使用javaFX做一个简单的音乐播放器

主要功能

1:加载歌曲列表

2:加载歌曲对应歌词

3:歌曲播放进度显示

4:歌词滚动

5:播放  暂停  上一首 下一首

界面如下

组件说明:

1:页面布局 容器 主要是  Group  HBox  AnchorPane  StackPane

2:左侧歌曲列表 使用的ListView  歌曲是下载后放到固定路径

3:右侧歌词使用 Text显示 简单设置了一下样式  歌词文件与歌曲一一对应,放到本地固定路径

4:歌曲进度使用 ProgressBar

5:按钮是Button  设置了一个小的背景图片

使用描述:

点击一首歌曲,开始播放,加载条显示播放进度,歌词向上滚动,使用上一首,下一首顺序切歌,或点击歌曲列表随机切歌。

功能实现说明:

1:加载歌曲列表

//文件前缀
String filePre = "file:///";
Path path = Paths.get(songsPath);
try (DirectoryStream<Path> entried = Files.newDirectoryStream(path)) {
for (Path entry : entried) {
fileList.add(filePre + songsPath + entry.getFileName());
}
} ListView<String> listView = new ListView<String>(data);
for (int i = 0; i < fileList.size(); i++) {
int a = fileList.get(i).lastIndexOf('/');
int b = fileList.get(i).lastIndexOf('.');
data.addAll(fileList.get(i).substring(a + 1, b));
}
listView.setItems(data);

2:加载歌词

FileInputStream fileInputStream = null;
InputStreamReader reader = null;
BufferedReader reader1 = null;
try {
String mediaString = media.getSource();
String songName = mediaString.substring(mediaString.lastIndexOf("/") + 1, mediaString.lastIndexOf("."));
File lyricFile = new File(songsLyPath + songName + ".txt");
fileInputStream = new FileInputStream(lyricFile);
reader = new InputStreamReader(fileInputStream);
reader1 = new BufferedReader(reader);
StringBuffer strB = new StringBuffer(songName + "\n------------------\n");
// 最后一行 返回null 不要写"" 永远不会等于""会 进入死循环的
String str = "";
while ((str = reader1.readLine()) != null) {
strB.append(str + "\n");
}
ly.setText(strB.toString());
} catch (FileNotFoundException e) { } finally {
reader1.close();
reader.close();
fileInputStream.close();
}

3:播放进度条实现

KeyValue kv = new KeyValue(pbar.progressProperty(), 1);
KeyFrame kf1 = new KeyFrame(mediaPlayer.getTotalDuration(), kv);
pbTimeLine = new Timeline();
pbTimeLine.getKeyFrames().add(kf1);

4:歌词滚动实现

//        歌词动作
Pane pane = new Pane();
tt = new TranslateTransition();
tt.setNode(pane);
tt.setFromX(0);
tt.setToX(800);
pane.translateXProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observableValue, Number number, Number t1) {
ly.setTranslateY(-t1.intValue());
}
});

5:切歌

/**
* 切歌
*
* @param flag
*/
private void changeSong(String flag) {
mediaPlayer.stop();
((Group) scene.getRoot()).getChildren().remove(mediaView);
int cunrIndex = next;
if ("next".equals(flag)) {
//下一首
if (next + 1 < fileList.size()) {
cunrIndex = ++next;
}
} else {
//上一首
if (next > 0) {
cunrIndex = --next;
}
}
media = new Media(fileList.get(cunrIndex));
mediaPlayer = new MediaPlayer(media);
mediaPlayer.setAutoPlay(true);
mediaView = new MediaView(mediaPlayer);
((Group) scene.getRoot()).getChildren().addAll(mediaView);
setPauseImg(); newSongProSettin();
}

初学-javaFX的更多相关文章

  1. DDD初学指南

    去年就打算总结一下,结果新换的工作特别忙,就迟迟没有认真动手.主要内容是很多初学DDD甚至于学习很长时间的同学没有弄明白DDD是什么,适合什么情况.这世界上没有银弹,抛开了适合的场景孤立的去研究DDD ...

  2. gulp初学

    原文地址:gulp初学 至于gulp与grunt的区别,用过的人都略知一二,总的来说就是2点: 1.gulp的gulpfile.js  配置简单而且更容易阅读和维护.之所以如此,是因为它们的工作方式不 ...

  3. 初学seaJs模块化开发,利用grunt打包,减少http请求

    原文地址:初学seaJs模块化开发,利用grunt打包,减少http请求 未压缩合并的演示地址:demo2 学习seaJs的模块化开发,适合对seajs基础有所了解的同学看,目录结构 js — —di ...

  4. 问题记录:JavaFx 鼠标滑轮滚动事件监听!

    问题描述: 在listview的item里面添加鼠标拖拽排序功能.代码如下: setOnMouseDragged(event -> { //设定鼠标长按0.3秒后才可拖拽 防止误操作 isCan ...

  5. 初学Vue2.0--基础篇

    概述: 鉴于本人初学,使用的编译器是webStorm,需添加对VUE的支持,添加方法可以参考 http://www.jianshu.com/p/142dae4f8b51. 起步: 1. 扎实的 Jav ...

  6. JavaFx客户端服务器C/S架构搭建

    客户端获取服务器端软件更新版本方法: package com.platform.ui.update; import java.io.BufferedInputStream; import java.i ...

  7. JavaFX 教程资料收集

    1. JavaFX中文资料 http://www.javafxchina.net/blog/docs/tutorial1/ 2. JavaFX入门教程 http://www.xrpmoon.com/c ...

  8. 初学Python

    初学Python 1.Python初识 life is short you need python--龟叔名言 Python是一种简洁优美语法接近自然语言的一种全栈开发语言,由"龟叔&quo ...

  9. Javascript初学篇章_5(对象)

    对象 Javascript是一种面向对象的语言,因此可以使用面向对象的思想来进行javascript程序设计对象就是由一些彼此相关的属性和方法集合在一起而构成的一个数据实体.举个例子,一只猫是个对象, ...

  10. 初学Objective-C语言需要了解的星星点点

             其实大多数开发初学者都有一些相同的特点,可以说是一种“职业病”.Most有其他平台开发基础的初学者,看到Xcode就想摩拳擦掌:看到Interface Builder就想跃跃欲试:而 ...

随机推荐

  1. imputation-综述文章:关于网络推理的scRNA序列插补工具基准突出了高稀疏性水平下的性能缺陷

    文章题目: Benchmarking scRNA-seq imputation tools with respect to network inference highlights 中文题目: 关于网 ...

  2. AD中添加原理图文档模板-转载

    (24条消息) AD中添加原理图文档模板_shuguang552的博客-CSDN博客_ad原理图模板

  3. vue子组件为父组件属性写值

    父组件调用子组件代码(关键字sync): <importModel :visible.sync="dialogModelVisible"></importMode ...

  4. 杭电oj 青年歌手大奖赛_评委会打分

    Problem Description 青年歌手大奖赛中,评委会给参赛选手打分.选手得分规则为去掉一个最高分和一个最低分,然后计算平均得分,请编程输出某选手的得分.   Input 输入数据有多组,每 ...

  5. Software--电商平台--Module 5 Order & Payment

    2018-01-10  14:11:30 电商平台 订购和支付 模块 一: 整体示意图 二:构建一个框架来处理 领域模型内部发生的事情--领域事件 IDomainEvent 标识模型中的 Domain ...

  6. elmentui 表单验证问题

    <template> <div class="container"> <el-form ref="ruleForm" :model ...

  7. Flash、EEPROM、SRAM的区别与理解

    Flash.EEPROM.SRAM的区别与理解1. Flash.EEPROM.SRAM的区别(1) Flash存储器Flash适用于速度要求高.容量要求大.掉电时要求数据不丢失的场合. (2) EEP ...

  8. win10 + ubuntu 下右键新建md文件(转载)

    win10系统 由于前人的总结很不错,所以,在这里附上链接 原文链接 ubuntu系统(linux) 对于ubuntu系统下,这个操作更方便了. 原文链接 不仅是markdown文档,还有.doc.e ...

  9. 4、word—截图的试卷背景为黑色,如何去掉呢?

    1.[图片格式]->[校正]->[锐化50%] 2.[图片格式]->[校正]->[亮度/对比度]选择一个适合自己的

  10. mybatis-plus 3.4.3.1 进行批量 saveOrUpdate

    service类通过 SqlHelper.saveOrUpdateBatch 实现通过自定义的 唯一索引 进行 批量保存更新 import com.baomidou.mybatisplus.core. ...