使用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. ant Vue select 多条数据重复的问题

    1.问题描述:select实现下拉的功能,并且带前端搜索,但是后端给的数据没去重,对象中所有的参数值有保持一致,试了下,发现只要key值和value值不一致就不会报错: 2.解决:key值用index ...

  2. selenium浏览器参数设置详解——转

    所有参数 https://peter.sh/experiments/chromium-command-line-switches/ 参数使用介绍 https://blog.csdn.net/XianZ ...

  3. Linux-crontab定期执行程序的命令

    https://www.runoob.com/linux/linux-comm-crontab.html Linux crontab 是用来定期执行程序的命令. 当安装完成操作系统之后,默认便会启动此 ...

  4. 教你三分钟开发开发java短信验证码

    现如今,绝大多数网站和app都需要支持手机号注册.手机登录,这就需要开发者实现短信验证码的功能,对于很多小白同学来说,没接触过,没有思路,下面小编就给大家详解一下. 发送短信的功能需要借助第三方的短信 ...

  5. mysql剪贴板

    // mysql 8.0 连接数据源的配置文件 <!--数据源--><bean id="dataSource" class="com.alibaba.d ...

  6. 【LeetCode - 1055】形成字符串的最短路径

    1.题目描述 代码: #include <iostream> #include <string> using namespace std; const int MAX_LETT ...

  7. Day15-static、抽象类、接口、内部类

    static.抽象类.接口.内部类 一.static关键字详解 1.静态的变量/方法 package Demo02; //static public class Student { private s ...

  8. Liunx安装eclipse-mosquitto之docker容器

    1.docker拉取 docker pull eclipse-mosquitto 2.查看镜像 docker images 3.建立配置目录 mkdir -p /mnt/mosquitto/confi ...

  9. kali 下安装tplmap

    kali 下安装tplmap 1. 安装kali下的python2的pip工具 kali2020版及以上, 输入python2命令会执行python2, python3也存在. 但pip默认是pip3 ...

  10. LSP原则中的逆变和协变

    在复习过程中,LSP原则是个很重要的内容.这里先给出LSP原则的定义. LSP定义Functions that use pointers or referrnces to base classes m ...