Java GUI-网络音乐播放器
效果展示
以下为部分实例代码
根据获取源获取音乐信息,例如:歌名、歌手、时长、专辑等信息。
private List<String> getTopListInfo(String url){ List<String> infoList = null;// 信息数组 Document doc;// 文档 try { doc = Jsoup.connect(url).get();// 抓取对应url页面 if (doc != null){ infoList = new ArrayList<>(); Elements topLists = doc.select("ul li .name a");// 获取排行榜 for (int i=0;i<topLists.size();i++){ if(i <4){//获取前四个榜单 String topList = Jsoup.connect("https://music.163.com"+topLists.get(i).attr("href")).get().select("#song-list-pre-data").get(0).text(); infoList.add(topList); } } } } catch (IOException e) { e.printStackTrace(); } return infoList; }
根据获取的信息中歌曲的ID可以获取歌曲歌词信息。
String getLyricContent(String id) { String lyricContent = ""; String url = "https://music.163.com/api/song/lyric?id=" + id + "&&lv=1&kv=1&tv=-1"; Document doc; try { doc = Jsoup.connect(url).get();// 根据url获取文档 if (doc != null) {// 判断文档是否为空 String lyric = doc.select("body").text();// 获取文档内容 lyricContent = JSON.parseObject(JSON.parseObject(lyric).getString("lrc")).getString("lyric");// 获取歌词内容 } } catch (IOException e) { e.printStackTrace(); } return lyricContent; }
缓存专辑图片到本地
void cacheImage(String url){ if (url != null){ URL urlPath;// 网址 DataInputStream dis = null;// 数据输入流 FileOutputStream fos = null;// 文件输出流 BufferedOutputStream bos = null;// 缓冲输出流 try { String fileName = url.substring(url.lastIndexOf("/")+1);// 截取网址最后的"/"后的内容做文件名 String path = "D:/PlayerCache";// 本地缓存地址 File file = new File(path); if (!file.exists()){// 判断文件目录是否存在,不存在创建 file.mkdirs(); } urlPath = new URL(url); dis = new DataInputStream(urlPath.openStream()); fos = new FileOutputStream(new File(path+File.separator+fileName)); bos = new BufferedOutputStream(fos); byte[] buff = new byte[1024]; int length; while ((length=dis.read(buff))!=-1){// 读取文件到本地 bos.write(buff,0,length); bos.flush(); } } catch (IOException e) { e.printStackTrace(); } finally { try { bos.close(); fos.close(); dis.close(); } catch (IOException e) { e.printStackTrace(); } } } }
拖拽含有目标源的文件生成歌曲列表。
new DropTarget(infoTable, DnDConstants.ACTION_COPY_OR_MOVE, new DropTargetAdapter() {// 拖拽txt文件 @Override public void drop(DropTargetDropEvent dtde) { if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {// 判断是否支持拖拽多个文件 dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);// 接受拖拽目标数据 List<File> files; try { files = (List<File>) dtde.getTransferable().getTransferData(DataFlavor.javaFileListFlavor);// 获取文件集合 if (files.size() == 1) {// 判断是否问单个文件 List<String> list = new FileRead().readTXT(files.get(0));// 获取文件内容 for (String s : list) {// 遍历获取url String url = s.replaceFirst("/#", "");// 去除url中的"/#" List<Map> mapList = MusicSpider.getInstance().getMusicInfo(url);// 获取音乐信息 musicListLen = mapList.size();// 获取音乐列表长度 createMusicList(mapList);// 创建音乐列表 } } } catch (UnsupportedFlavorException | IOException e) { e.printStackTrace(); } } } }, true);
生成歌曲列表方法
private void createMusicList(List<Map> mapList) { if (mapList != null && infoTable.getRowCount() == 0) {// 判断列表是否为空 Vector data = new Vector(); Vector name = new Vector(); Vector row; // 表头信息 name.add("标题"); name.add("歌手"); name.add("时长"); name.add("所属专辑"); name.add("ID"); name.add("ICON"); name.add("DURATION"); for (Map map : mapList) {// 遍历添加行数据 row = new Vector(); row.add(JSON.parseObject(map.get(0).toString()).getString("name")); row.add(JSON.parseObject(map.get(0).toString()).getString("artistsName")); row.add(JSON.parseObject(map.get(0).toString()).getString("duration")); row.add(JSON.parseObject(map.get(0).toString()).getString("albumName")); row.add(JSON.parseObject(map.get(0).toString()).getString("id")); row.add(JSON.parseObject(map.get(0).toString()).getString("albumPicUrl")); row.add(JSON.parseObject(map.get(0).toString()).getString("durationStamp")); data.add(row); } DefaultTableModel dtm = new DefaultTableModel(data, name) {// 表格DefaultTableModel public boolean isCellEditable(int row, int col) { return false; } }; infoTable.setModel(dtm);// 设置model // 设置表格第五列ID不显示 setTableColumnHide(infoTable,4); // 设置表格地六列ICON不显示 setTableColumnHide(infoTable,5); // 设置表格地七列DURATION不显示 setTableColumnHide(infoTable,6); DefaultTableCellRenderer dtcr = new DefaultTableCellRenderer();// 表格单元格DefaultTableCellRenderer dtcr.setHorizontalAlignment(SwingConstants.CENTER);// 文本水平居中 infoTable.setDefaultRenderer(Object.class, dtcr);// 设置renderer } }
设置列不显示的方法
private void setTableColumnHide(JTable t,int col){ t.getColumnModel().getColumn(col).setMaxWidth(0); t.getColumnModel().getColumn(col).setMinWidth(0); t.getTableHeader().getColumnModel().getColumn(col).setMaxWidth(0); t.getTableHeader().getColumnModel().getColumn(col).setMinWidth(0); }
Ps:
1.获取的音乐信息为JSON格式,需要自行处理获取需要的信息。
2.如果遇到韩文可能乱码,可将需要显示文本的组件字体设置成:Arial Unicode MS。
声明:该文章仅供学习交流使用,不可用于其他途径。如果文章中有侵害到您或贵公司权益的,请联系本人进行删除。
作者:lightbc
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现