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。

 

 

声明:该文章仅供学习交流使用,不可用于其他途径。如果文章中有侵害到您或贵公司权益的,请联系本人进行删除。

posted @ 2020-03-08 19:36  lightbc  阅读(830)  评论(0编辑  收藏  举报