使用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. ICPC2020上海B - Mine Sweeper II

    思维 [B-Mine Sweeper II_第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(上海)(重现赛)@hzy0227 (nowcoder.com)](https://codeforc ...

  2. lg8862题解

    脑抽了,一开始想着扫描线然后用线段树求历史最大值.

  3. python打开Excel中指定的sheet表

    一个Excel中有多个sheet的时候,你在第几个sheet保存关闭的,那下次打开就在原来的那个表的位置,所以有时候你想--在打开一个Excel的时候指定到其中的一个sheet表,那么使用第三方库xl ...

  4. redis过期数据的底层存储结构

  5. Centos使用nohup实现后台运行程序

    nohup和&的区别& : 指在后台运行 nohup : 不挂断的运行,注意并没有后台运行的功能,,就是指,用nohup运行命令可以使命令永久的执行下去,和用户终端没有关系,例如我们断 ...

  6. 开发Unity3D空战类插件 战机HUD系统

    Fighter HUD System 当您使用Unity3D来开发飞行模拟或者空战类游戏时,这款Fighter HUD Sytem插件将会非常的适合用来充当您战机的HUD系统. 特点 此HUD系统的安 ...

  7. element UI 选择时间点(可选择某一个或者多个时间点)

    html代码如下: <el-date-picker ref="datesRef" type="dates" v-model="searchObj ...

  8. memoize

    function getArea(r){ console.log(r); return Math.PI * r * r } function memoize(f){ let cache = {}; r ...

  9. Office 2016 未授权

    用于管理 Office 批量激活的工具 https://docs.microsoft.com/zh-cn/DeployOffice/vlactivation/tools-to-manage-volum ...

  10. ARP协议 路由器原理

    ARP协议 路由器原理     1 广播与广播域 广播:将广播地址作为目的地址的数据帧 广播域:网络中能够接收到同一个广播所有节点的集合(在这里广播域越小越好) 交换机控制不了广播 路由器可以控制广播 ...