初学-javaFX

Posted on 2022-04-26 15:48  慢热并不是缺点  阅读(97)  评论(0编辑  收藏  举报

使用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();
    }

 

Copyright © 2024 慢热并不是缺点
Powered by .NET 8.0 on Kubernetes