JavaFX mp3音频、mp4音频、文本数据叠加

JavaFX mp3音频、mp4音频、文本数据叠加,java,multithreading,javafx,Java,Multithreading,Javafx,我正在开发一个应用程序,可以在不同的文件夹位置查找文件,并在表视图中显示所有文件。如果用户单击一行,则该文件将显示在程序的右侧。目前,它可以处理txt、mp3文件和mp4文件 说明: 我创建了两个服务,FileSearchService和FilePreviewService。FileSearchService搜索文件并将其添加到静态observableList中。FilePreviewService获取所选行,检查文件类型是否为txt、mp3或其他,并使用FileProcessor抽象类处理所选

我正在开发一个应用程序,可以在不同的文件夹位置查找文件,并在表视图中显示所有文件。如果用户单击一行,则该文件将显示在程序的右侧。目前,它可以处理txt、mp3文件和mp4文件

说明:
我创建了两个服务,FileSearchServiceFilePreviewService。FileSearchService搜索文件并将其添加到静态observableList中。FilePreviewService获取所选行,检查文件类型是否为txt、mp3或其他,并使用FileProcessor抽象类处理所选项。如果所选项目的类型为txt,则FileProcessor、TextProcessor的子类将发挥作用,并返回一个带有TextArea的AnchorPane,作为附加到该AnchorPane的子类。文本区域设置从所选项目(行)获取的文本。最后,锚烷返回主控制器。然后,主控制器显示该项目

问题:
如果我点击一行,其中包含一个mp4(或mp3)文件,那么mp4(或mp3)文件可以正常播放,并显示在我的主播台上。当mp4(或mp3)播放时,如果我点击一个txt文件,该文件的数据将显示在anchorPane上,但mp4(或mp3)的音频仍在播放

下面是两张描述我的问题的图片

我单击了一个视频文件,视频显示在我的应用程序的右侧。

现在我点击一个txt文件,然后主播会显示文本数据,但视频(而不是音频)仍在播放

现在,如果我点击一个mp3文件,那么mp3和mp4音频都会叠加

我想要什么

我只想执行一项。如果正在播放mp3文件,并且我单击了mp4视频,则mp3应该停止,视频应该播放。我的应用程序可以处理多个连续的mp3、mp4或txt单击。单击mp4文件后再单击txt文件不会得到处理

FilePreviewService.Java

public class FilePreviewService extends Service<Void> {
    FileModel model;
    private FileProcesser fileProcesser;
    String fileExtension = "";


    public FileProcesser getFileProcesser() {
        return fileProcesser;
    }

    public FilePreviewService(FileModel model) {
        this.model = model;
        this.fileExtension = reverseFileName(getFileExtension(model));

    }

    @Override
    protected Task<Void> createTask() {
        return new Task<Void>() {
            @Override
            protected Void call() throws Exception {
                System.out.println("FIlePreviewService, createTask() Thread = " + Thread.currentThread().getName());
               fileProcesser = FileUtility.getFileProcesserFromUtil(fileExtension);
               getFileProcesser().processFile(model.getFileLocation());
                return null;
            }


        };
    }
}
public final class AudioProcesser extends FileProcesser{
    static AudioProcesser audioProcesser;
     Media media;
     MediaPlayer mediaPlayer;


    public static AudioProcesser getAudioProcesser() {
        if (audioProcesser == null)
            audioProcesser = new AudioProcesser();
        return audioProcesser;
    }

    @Override
    public void processFile(String fileLocation) throws Exception {
        switch (getAudioMediaStatus()) {
            case NOT_PLAYED:
                playMedia(fileLocation);
                break;
            case PLAYING:
                /* TIP:
                If mediaPlayer.stop is placed after the line
                *  media = new Media(new File(fileLocation).toURI().toString());
                    mediaPlayer = new MediaPlayer(media);
                    then multiple music play together when multiple different row gets selected,
                    one after another
                */
                mediaPlayer.stop();
                playMedia(fileLocation);
                break;
            default:
                System.out.println("Audio in default case");
        }
    }

    private void playMedia(String fileLocation) {
        media = new Media(new File(fileLocation).toURI().toString());
        mediaPlayer = new MediaPlayer(media);
        mediaPlayer.play();
        setAudioMediaStatus(PLAYING);
    }
}
public class VideoProcesser extends FileProcesser {
    static VideoProcesser videoProcesser = null;
    MediaPlayer mediaPlayer;
    Media media;
    MediaView mediaView;

    @Override
    public void processFile(String fileLocation) throws Exception {
        switch (getVideoMediaStatus()) {
            case NOT_PLAYED:
                playVideo(fileLocation);
                break;
            case PLAYING:
                mediaPlayer.stop();
                playVideo(fileLocation);
                break;
            default:
                System.out.println("Audio in default case");
        }


//        pane.getChildren().add();
    }

    @Override
    public AnchorPane getPane(){
        return pane;
    }


    private void playVideo(String fileLocation) {
        System.out.println("VideoProcesser Thread = " + Thread.currentThread().getName());
        media = new Media(new File(fileLocation).toURI().toString());
        mediaPlayer = new MediaPlayer(media);
//        mediaPlayer.setAutoPlay(true);
        if(mediaView == null) {
            mediaView = new MediaView(mediaPlayer);
        }
        mediaView.setMediaPlayer(mediaPlayer);
        mediaView.setPreserveRatio(true);
        mediaPlayer.play();
        mediaPlayer.setOnError(() -> System.out.println("Current error: "+mediaPlayer.getError()));
        setVideoMediaStatus(PLAYING);
        pane.getChildren().add(mediaView);
    }

    public static FileProcesser getVideoProcesser() {
        if(videoProcesser == null)
            videoProcesser = new VideoProcesser();
        return videoProcesser;
    }
}
public class TextProcesser extends FileProcesser {

    static TextProcesser textProcesser = null;

    public static FileProcesser getTextProcesser() {
        if(textProcesser == null)
            textProcesser = new TextProcesser();
        return textProcesser;
    }

    @Override
    public void processFile(String fileLocation) throws IOException {
        InputStream inputStream = new FileInputStream(fileLocation);
        Scanner sc = null;

        //text file: 25.1_-_Marvel_Graph.txt, size 1.5MB
        System.out.println("Data reading started = " + new Date());
        if (inputStream != null) {
            StringBuilder txtData = new StringBuilder("");
            try {
                sc = new Scanner(inputStream, "UTF-8");
                while (sc.hasNextLine()) {
                    txtData.append(sc.nextLine());
                }
                // note that Scanner suppresses exceptions
                if (sc.ioException() != null) {
                    throw sc.ioException();
                }
            } finally {
                if (inputStream != null) {
                    inputStream.close();
                }
                if (sc != null) {
                    sc.close();
                }
            }
            dataToDisplay = txtData.toString();
        }
        System.out.println("Data reading finished = " + new Date());

    }

    @Override
    public AnchorPane getPane(){
        TextArea txtArea = new TextArea();
        txtArea.setEditable(false);
        txtArea.setText((String) dataToDisplay);
        txtArea.setPrefHeight(778);
        txtArea.setWrapText(true);
        pane.getChildren().add(txtArea);
        return pane;
    }
}
public void initialize(URL location, ResourceBundle resources) {
        init();
        initFilePreviewExecutors();

        for (int i = 0; i < locationsToSearch.length; i++) {
            fileModel = new FileModel(locationsToSearch[i]);
            FileSearchService fileSearchService = new FileSearchService(fileModel);
            fileSearchService.setExecutor(fileSearchExecutor);
            fileSearchService.setOnSucceeded(e -> {
                fileSearchService.setFileSearchCompleted(true);
                searchFinished = true;
            });
            fileSearchService.start();

            CacheFileService cfs = new CacheFileService(locationsToSearch[i]);

        }
        try {
            stop();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        nameCol.setCellValueFactory(new PropertyValueFactory<>("fileName"));
        sizeCol.setCellValueFactory(new PropertyValueFactory<>("fileSize"));
        locationCol.setCellValueFactory(new PropertyValueFactory<>("fileLocation"));

        recordsTableView.setItems(fileModel.getData());

        recordsTableView.setContextMenu(new ContextMenu(showRecordInfo));

        recordsTableView.setRowFactory(tv -> {
            TableRow<FileModel> row = new TableRow<>();
            row.setOnMouseClicked(event -> {
                if(!row.isEmpty() && event.getButton() == MouseButton.PRIMARY && event.getClickCount() == 1) {
                    FileModel fileModel = row.getItem();
                    filePreviewService = new FilePreviewService(fileModel);
                    filePreviewService.setExecutor(filePreviewExecutor);
                    filePreviewService.setOnSucceeded(event1 -> {
                        recordPreviewPane = filePreviewService.getFileProcesser().getPane();
                        if(recordPreviewPane == null) {
                            System.out.println("RECORDPREVIEWPANE IS NULL");
                        }
                        previewPane.setContent(recordPreviewPane);
                    });
                    filePreviewService.restart();

                } else if(!row.isEmpty() && event.getButton() == MouseButton.SECONDARY) {
                    FileModel fileModel = row.getItem();
                        showRecordInfo.setOnAction( e -> {
                        Scene scene = defaultViewFactory.getRecordInfoScene(fileModel);
                        Stage stage = new Stage();
                        stage.setScene(scene);
                        stage.show();
                    });

                }
            });
            return row;});


    }
VideoProcesser.Java

public class FilePreviewService extends Service<Void> {
    FileModel model;
    private FileProcesser fileProcesser;
    String fileExtension = "";


    public FileProcesser getFileProcesser() {
        return fileProcesser;
    }

    public FilePreviewService(FileModel model) {
        this.model = model;
        this.fileExtension = reverseFileName(getFileExtension(model));

    }

    @Override
    protected Task<Void> createTask() {
        return new Task<Void>() {
            @Override
            protected Void call() throws Exception {
                System.out.println("FIlePreviewService, createTask() Thread = " + Thread.currentThread().getName());
               fileProcesser = FileUtility.getFileProcesserFromUtil(fileExtension);
               getFileProcesser().processFile(model.getFileLocation());
                return null;
            }


        };
    }
}
public final class AudioProcesser extends FileProcesser{
    static AudioProcesser audioProcesser;
     Media media;
     MediaPlayer mediaPlayer;


    public static AudioProcesser getAudioProcesser() {
        if (audioProcesser == null)
            audioProcesser = new AudioProcesser();
        return audioProcesser;
    }

    @Override
    public void processFile(String fileLocation) throws Exception {
        switch (getAudioMediaStatus()) {
            case NOT_PLAYED:
                playMedia(fileLocation);
                break;
            case PLAYING:
                /* TIP:
                If mediaPlayer.stop is placed after the line
                *  media = new Media(new File(fileLocation).toURI().toString());
                    mediaPlayer = new MediaPlayer(media);
                    then multiple music play together when multiple different row gets selected,
                    one after another
                */
                mediaPlayer.stop();
                playMedia(fileLocation);
                break;
            default:
                System.out.println("Audio in default case");
        }
    }

    private void playMedia(String fileLocation) {
        media = new Media(new File(fileLocation).toURI().toString());
        mediaPlayer = new MediaPlayer(media);
        mediaPlayer.play();
        setAudioMediaStatus(PLAYING);
    }
}
public class VideoProcesser extends FileProcesser {
    static VideoProcesser videoProcesser = null;
    MediaPlayer mediaPlayer;
    Media media;
    MediaView mediaView;

    @Override
    public void processFile(String fileLocation) throws Exception {
        switch (getVideoMediaStatus()) {
            case NOT_PLAYED:
                playVideo(fileLocation);
                break;
            case PLAYING:
                mediaPlayer.stop();
                playVideo(fileLocation);
                break;
            default:
                System.out.println("Audio in default case");
        }


//        pane.getChildren().add();
    }

    @Override
    public AnchorPane getPane(){
        return pane;
    }


    private void playVideo(String fileLocation) {
        System.out.println("VideoProcesser Thread = " + Thread.currentThread().getName());
        media = new Media(new File(fileLocation).toURI().toString());
        mediaPlayer = new MediaPlayer(media);
//        mediaPlayer.setAutoPlay(true);
        if(mediaView == null) {
            mediaView = new MediaView(mediaPlayer);
        }
        mediaView.setMediaPlayer(mediaPlayer);
        mediaView.setPreserveRatio(true);
        mediaPlayer.play();
        mediaPlayer.setOnError(() -> System.out.println("Current error: "+mediaPlayer.getError()));
        setVideoMediaStatus(PLAYING);
        pane.getChildren().add(mediaView);
    }

    public static FileProcesser getVideoProcesser() {
        if(videoProcesser == null)
            videoProcesser = new VideoProcesser();
        return videoProcesser;
    }
}
public class TextProcesser extends FileProcesser {

    static TextProcesser textProcesser = null;

    public static FileProcesser getTextProcesser() {
        if(textProcesser == null)
            textProcesser = new TextProcesser();
        return textProcesser;
    }

    @Override
    public void processFile(String fileLocation) throws IOException {
        InputStream inputStream = new FileInputStream(fileLocation);
        Scanner sc = null;

        //text file: 25.1_-_Marvel_Graph.txt, size 1.5MB
        System.out.println("Data reading started = " + new Date());
        if (inputStream != null) {
            StringBuilder txtData = new StringBuilder("");
            try {
                sc = new Scanner(inputStream, "UTF-8");
                while (sc.hasNextLine()) {
                    txtData.append(sc.nextLine());
                }
                // note that Scanner suppresses exceptions
                if (sc.ioException() != null) {
                    throw sc.ioException();
                }
            } finally {
                if (inputStream != null) {
                    inputStream.close();
                }
                if (sc != null) {
                    sc.close();
                }
            }
            dataToDisplay = txtData.toString();
        }
        System.out.println("Data reading finished = " + new Date());

    }

    @Override
    public AnchorPane getPane(){
        TextArea txtArea = new TextArea();
        txtArea.setEditable(false);
        txtArea.setText((String) dataToDisplay);
        txtArea.setPrefHeight(778);
        txtArea.setWrapText(true);
        pane.getChildren().add(txtArea);
        return pane;
    }
}
public void initialize(URL location, ResourceBundle resources) {
        init();
        initFilePreviewExecutors();

        for (int i = 0; i < locationsToSearch.length; i++) {
            fileModel = new FileModel(locationsToSearch[i]);
            FileSearchService fileSearchService = new FileSearchService(fileModel);
            fileSearchService.setExecutor(fileSearchExecutor);
            fileSearchService.setOnSucceeded(e -> {
                fileSearchService.setFileSearchCompleted(true);
                searchFinished = true;
            });
            fileSearchService.start();

            CacheFileService cfs = new CacheFileService(locationsToSearch[i]);

        }
        try {
            stop();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        nameCol.setCellValueFactory(new PropertyValueFactory<>("fileName"));
        sizeCol.setCellValueFactory(new PropertyValueFactory<>("fileSize"));
        locationCol.setCellValueFactory(new PropertyValueFactory<>("fileLocation"));

        recordsTableView.setItems(fileModel.getData());

        recordsTableView.setContextMenu(new ContextMenu(showRecordInfo));

        recordsTableView.setRowFactory(tv -> {
            TableRow<FileModel> row = new TableRow<>();
            row.setOnMouseClicked(event -> {
                if(!row.isEmpty() && event.getButton() == MouseButton.PRIMARY && event.getClickCount() == 1) {
                    FileModel fileModel = row.getItem();
                    filePreviewService = new FilePreviewService(fileModel);
                    filePreviewService.setExecutor(filePreviewExecutor);
                    filePreviewService.setOnSucceeded(event1 -> {
                        recordPreviewPane = filePreviewService.getFileProcesser().getPane();
                        if(recordPreviewPane == null) {
                            System.out.println("RECORDPREVIEWPANE IS NULL");
                        }
                        previewPane.setContent(recordPreviewPane);
                    });
                    filePreviewService.restart();

                } else if(!row.isEmpty() && event.getButton() == MouseButton.SECONDARY) {
                    FileModel fileModel = row.getItem();
                        showRecordInfo.setOnAction( e -> {
                        Scene scene = defaultViewFactory.getRecordInfoScene(fileModel);
                        Stage stage = new Stage();
                        stage.setScene(scene);
                        stage.show();
                    });

                }
            });
            return row;});


    }
TextProcesser.Java

public class FilePreviewService extends Service<Void> {
    FileModel model;
    private FileProcesser fileProcesser;
    String fileExtension = "";


    public FileProcesser getFileProcesser() {
        return fileProcesser;
    }

    public FilePreviewService(FileModel model) {
        this.model = model;
        this.fileExtension = reverseFileName(getFileExtension(model));

    }

    @Override
    protected Task<Void> createTask() {
        return new Task<Void>() {
            @Override
            protected Void call() throws Exception {
                System.out.println("FIlePreviewService, createTask() Thread = " + Thread.currentThread().getName());
               fileProcesser = FileUtility.getFileProcesserFromUtil(fileExtension);
               getFileProcesser().processFile(model.getFileLocation());
                return null;
            }


        };
    }
}
public final class AudioProcesser extends FileProcesser{
    static AudioProcesser audioProcesser;
     Media media;
     MediaPlayer mediaPlayer;


    public static AudioProcesser getAudioProcesser() {
        if (audioProcesser == null)
            audioProcesser = new AudioProcesser();
        return audioProcesser;
    }

    @Override
    public void processFile(String fileLocation) throws Exception {
        switch (getAudioMediaStatus()) {
            case NOT_PLAYED:
                playMedia(fileLocation);
                break;
            case PLAYING:
                /* TIP:
                If mediaPlayer.stop is placed after the line
                *  media = new Media(new File(fileLocation).toURI().toString());
                    mediaPlayer = new MediaPlayer(media);
                    then multiple music play together when multiple different row gets selected,
                    one after another
                */
                mediaPlayer.stop();
                playMedia(fileLocation);
                break;
            default:
                System.out.println("Audio in default case");
        }
    }

    private void playMedia(String fileLocation) {
        media = new Media(new File(fileLocation).toURI().toString());
        mediaPlayer = new MediaPlayer(media);
        mediaPlayer.play();
        setAudioMediaStatus(PLAYING);
    }
}
public class VideoProcesser extends FileProcesser {
    static VideoProcesser videoProcesser = null;
    MediaPlayer mediaPlayer;
    Media media;
    MediaView mediaView;

    @Override
    public void processFile(String fileLocation) throws Exception {
        switch (getVideoMediaStatus()) {
            case NOT_PLAYED:
                playVideo(fileLocation);
                break;
            case PLAYING:
                mediaPlayer.stop();
                playVideo(fileLocation);
                break;
            default:
                System.out.println("Audio in default case");
        }


//        pane.getChildren().add();
    }

    @Override
    public AnchorPane getPane(){
        return pane;
    }


    private void playVideo(String fileLocation) {
        System.out.println("VideoProcesser Thread = " + Thread.currentThread().getName());
        media = new Media(new File(fileLocation).toURI().toString());
        mediaPlayer = new MediaPlayer(media);
//        mediaPlayer.setAutoPlay(true);
        if(mediaView == null) {
            mediaView = new MediaView(mediaPlayer);
        }
        mediaView.setMediaPlayer(mediaPlayer);
        mediaView.setPreserveRatio(true);
        mediaPlayer.play();
        mediaPlayer.setOnError(() -> System.out.println("Current error: "+mediaPlayer.getError()));
        setVideoMediaStatus(PLAYING);
        pane.getChildren().add(mediaView);
    }

    public static FileProcesser getVideoProcesser() {
        if(videoProcesser == null)
            videoProcesser = new VideoProcesser();
        return videoProcesser;
    }
}
public class TextProcesser extends FileProcesser {

    static TextProcesser textProcesser = null;

    public static FileProcesser getTextProcesser() {
        if(textProcesser == null)
            textProcesser = new TextProcesser();
        return textProcesser;
    }

    @Override
    public void processFile(String fileLocation) throws IOException {
        InputStream inputStream = new FileInputStream(fileLocation);
        Scanner sc = null;

        //text file: 25.1_-_Marvel_Graph.txt, size 1.5MB
        System.out.println("Data reading started = " + new Date());
        if (inputStream != null) {
            StringBuilder txtData = new StringBuilder("");
            try {
                sc = new Scanner(inputStream, "UTF-8");
                while (sc.hasNextLine()) {
                    txtData.append(sc.nextLine());
                }
                // note that Scanner suppresses exceptions
                if (sc.ioException() != null) {
                    throw sc.ioException();
                }
            } finally {
                if (inputStream != null) {
                    inputStream.close();
                }
                if (sc != null) {
                    sc.close();
                }
            }
            dataToDisplay = txtData.toString();
        }
        System.out.println("Data reading finished = " + new Date());

    }

    @Override
    public AnchorPane getPane(){
        TextArea txtArea = new TextArea();
        txtArea.setEditable(false);
        txtArea.setText((String) dataToDisplay);
        txtArea.setPrefHeight(778);
        txtArea.setWrapText(true);
        pane.getChildren().add(txtArea);
        return pane;
    }
}
public void initialize(URL location, ResourceBundle resources) {
        init();
        initFilePreviewExecutors();

        for (int i = 0; i < locationsToSearch.length; i++) {
            fileModel = new FileModel(locationsToSearch[i]);
            FileSearchService fileSearchService = new FileSearchService(fileModel);
            fileSearchService.setExecutor(fileSearchExecutor);
            fileSearchService.setOnSucceeded(e -> {
                fileSearchService.setFileSearchCompleted(true);
                searchFinished = true;
            });
            fileSearchService.start();

            CacheFileService cfs = new CacheFileService(locationsToSearch[i]);

        }
        try {
            stop();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        nameCol.setCellValueFactory(new PropertyValueFactory<>("fileName"));
        sizeCol.setCellValueFactory(new PropertyValueFactory<>("fileSize"));
        locationCol.setCellValueFactory(new PropertyValueFactory<>("fileLocation"));

        recordsTableView.setItems(fileModel.getData());

        recordsTableView.setContextMenu(new ContextMenu(showRecordInfo));

        recordsTableView.setRowFactory(tv -> {
            TableRow<FileModel> row = new TableRow<>();
            row.setOnMouseClicked(event -> {
                if(!row.isEmpty() && event.getButton() == MouseButton.PRIMARY && event.getClickCount() == 1) {
                    FileModel fileModel = row.getItem();
                    filePreviewService = new FilePreviewService(fileModel);
                    filePreviewService.setExecutor(filePreviewExecutor);
                    filePreviewService.setOnSucceeded(event1 -> {
                        recordPreviewPane = filePreviewService.getFileProcesser().getPane();
                        if(recordPreviewPane == null) {
                            System.out.println("RECORDPREVIEWPANE IS NULL");
                        }
                        previewPane.setContent(recordPreviewPane);
                    });
                    filePreviewService.restart();

                } else if(!row.isEmpty() && event.getButton() == MouseButton.SECONDARY) {
                    FileModel fileModel = row.getItem();
                        showRecordInfo.setOnAction( e -> {
                        Scene scene = defaultViewFactory.getRecordInfoScene(fileModel);
                        Stage stage = new Stage();
                        stage.setScene(scene);
                        stage.show();
                    });

                }
            });
            return row;});


    }
MainController.Java

public class FilePreviewService extends Service<Void> {
    FileModel model;
    private FileProcesser fileProcesser;
    String fileExtension = "";


    public FileProcesser getFileProcesser() {
        return fileProcesser;
    }

    public FilePreviewService(FileModel model) {
        this.model = model;
        this.fileExtension = reverseFileName(getFileExtension(model));

    }

    @Override
    protected Task<Void> createTask() {
        return new Task<Void>() {
            @Override
            protected Void call() throws Exception {
                System.out.println("FIlePreviewService, createTask() Thread = " + Thread.currentThread().getName());
               fileProcesser = FileUtility.getFileProcesserFromUtil(fileExtension);
               getFileProcesser().processFile(model.getFileLocation());
                return null;
            }


        };
    }
}
public final class AudioProcesser extends FileProcesser{
    static AudioProcesser audioProcesser;
     Media media;
     MediaPlayer mediaPlayer;


    public static AudioProcesser getAudioProcesser() {
        if (audioProcesser == null)
            audioProcesser = new AudioProcesser();
        return audioProcesser;
    }

    @Override
    public void processFile(String fileLocation) throws Exception {
        switch (getAudioMediaStatus()) {
            case NOT_PLAYED:
                playMedia(fileLocation);
                break;
            case PLAYING:
                /* TIP:
                If mediaPlayer.stop is placed after the line
                *  media = new Media(new File(fileLocation).toURI().toString());
                    mediaPlayer = new MediaPlayer(media);
                    then multiple music play together when multiple different row gets selected,
                    one after another
                */
                mediaPlayer.stop();
                playMedia(fileLocation);
                break;
            default:
                System.out.println("Audio in default case");
        }
    }

    private void playMedia(String fileLocation) {
        media = new Media(new File(fileLocation).toURI().toString());
        mediaPlayer = new MediaPlayer(media);
        mediaPlayer.play();
        setAudioMediaStatus(PLAYING);
    }
}
public class VideoProcesser extends FileProcesser {
    static VideoProcesser videoProcesser = null;
    MediaPlayer mediaPlayer;
    Media media;
    MediaView mediaView;

    @Override
    public void processFile(String fileLocation) throws Exception {
        switch (getVideoMediaStatus()) {
            case NOT_PLAYED:
                playVideo(fileLocation);
                break;
            case PLAYING:
                mediaPlayer.stop();
                playVideo(fileLocation);
                break;
            default:
                System.out.println("Audio in default case");
        }


//        pane.getChildren().add();
    }

    @Override
    public AnchorPane getPane(){
        return pane;
    }


    private void playVideo(String fileLocation) {
        System.out.println("VideoProcesser Thread = " + Thread.currentThread().getName());
        media = new Media(new File(fileLocation).toURI().toString());
        mediaPlayer = new MediaPlayer(media);
//        mediaPlayer.setAutoPlay(true);
        if(mediaView == null) {
            mediaView = new MediaView(mediaPlayer);
        }
        mediaView.setMediaPlayer(mediaPlayer);
        mediaView.setPreserveRatio(true);
        mediaPlayer.play();
        mediaPlayer.setOnError(() -> System.out.println("Current error: "+mediaPlayer.getError()));
        setVideoMediaStatus(PLAYING);
        pane.getChildren().add(mediaView);
    }

    public static FileProcesser getVideoProcesser() {
        if(videoProcesser == null)
            videoProcesser = new VideoProcesser();
        return videoProcesser;
    }
}
public class TextProcesser extends FileProcesser {

    static TextProcesser textProcesser = null;

    public static FileProcesser getTextProcesser() {
        if(textProcesser == null)
            textProcesser = new TextProcesser();
        return textProcesser;
    }

    @Override
    public void processFile(String fileLocation) throws IOException {
        InputStream inputStream = new FileInputStream(fileLocation);
        Scanner sc = null;

        //text file: 25.1_-_Marvel_Graph.txt, size 1.5MB
        System.out.println("Data reading started = " + new Date());
        if (inputStream != null) {
            StringBuilder txtData = new StringBuilder("");
            try {
                sc = new Scanner(inputStream, "UTF-8");
                while (sc.hasNextLine()) {
                    txtData.append(sc.nextLine());
                }
                // note that Scanner suppresses exceptions
                if (sc.ioException() != null) {
                    throw sc.ioException();
                }
            } finally {
                if (inputStream != null) {
                    inputStream.close();
                }
                if (sc != null) {
                    sc.close();
                }
            }
            dataToDisplay = txtData.toString();
        }
        System.out.println("Data reading finished = " + new Date());

    }

    @Override
    public AnchorPane getPane(){
        TextArea txtArea = new TextArea();
        txtArea.setEditable(false);
        txtArea.setText((String) dataToDisplay);
        txtArea.setPrefHeight(778);
        txtArea.setWrapText(true);
        pane.getChildren().add(txtArea);
        return pane;
    }
}
public void initialize(URL location, ResourceBundle resources) {
        init();
        initFilePreviewExecutors();

        for (int i = 0; i < locationsToSearch.length; i++) {
            fileModel = new FileModel(locationsToSearch[i]);
            FileSearchService fileSearchService = new FileSearchService(fileModel);
            fileSearchService.setExecutor(fileSearchExecutor);
            fileSearchService.setOnSucceeded(e -> {
                fileSearchService.setFileSearchCompleted(true);
                searchFinished = true;
            });
            fileSearchService.start();

            CacheFileService cfs = new CacheFileService(locationsToSearch[i]);

        }
        try {
            stop();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        nameCol.setCellValueFactory(new PropertyValueFactory<>("fileName"));
        sizeCol.setCellValueFactory(new PropertyValueFactory<>("fileSize"));
        locationCol.setCellValueFactory(new PropertyValueFactory<>("fileLocation"));

        recordsTableView.setItems(fileModel.getData());

        recordsTableView.setContextMenu(new ContextMenu(showRecordInfo));

        recordsTableView.setRowFactory(tv -> {
            TableRow<FileModel> row = new TableRow<>();
            row.setOnMouseClicked(event -> {
                if(!row.isEmpty() && event.getButton() == MouseButton.PRIMARY && event.getClickCount() == 1) {
                    FileModel fileModel = row.getItem();
                    filePreviewService = new FilePreviewService(fileModel);
                    filePreviewService.setExecutor(filePreviewExecutor);
                    filePreviewService.setOnSucceeded(event1 -> {
                        recordPreviewPane = filePreviewService.getFileProcesser().getPane();
                        if(recordPreviewPane == null) {
                            System.out.println("RECORDPREVIEWPANE IS NULL");
                        }
                        previewPane.setContent(recordPreviewPane);
                    });
                    filePreviewService.restart();

                } else if(!row.isEmpty() && event.getButton() == MouseButton.SECONDARY) {
                    FileModel fileModel = row.getItem();
                        showRecordInfo.setOnAction( e -> {
                        Scene scene = defaultViewFactory.getRecordInfoScene(fileModel);
                        Stage stage = new Stage();
                        stage.setScene(scene);
                        stage.show();
                    });

                }
            });
            return row;});


    }

如果我理解正确,当播放.mp4时,您正在尝试停止.mp3,反之亦然

首先是你问题的原因。当您启动.mp3时,您正在呼叫
AudioProcesser
,太棒了。因此,您可以通过该类启动一个新的
MediaPlayer
。 但是,您可以使用
视频处理器
类执行相同的操作。现在有两个
MediaPlayer
s同时运行,这就是音频重叠的原因

解决方案是,使用一个实例变量,并为其他类提供一些新的调用方法,即
stopMediaPlayer()
方法

下面的示例,对代码进行尽可能少的更改:

public final class AudioProcesser extends FileProcesser{
    //Always have one instance of the variable.
    static AudioProcesser audioProcesser = new AudioProcesser();
    private Media media;
    private MediaPlayer mediaPlayer;

    public static AudioProcesser getAudioProcesser() {
        return audioProcesser;
    }

    //Added an exposure to the underlying audioMediaStatus
    public void setAudioMediaStatus(AudioMediaStatus status){
        AudioMediaStatus.setAudioMediaStatus(status);
    }
    //Another exposure to the underlying audioMediaStatus
    public AudioMediaStatus getAudioMediaStatus(){
        return AudioMediaStatus.getAudioMediaStatus();
    }
    //Used only for this class
    private void setMediaPlayer(String fileLocation){
        Media media = new Media(new File(fileLocation).toURI().toString());
        mediaPlayer = new MediaPlayer(media);
    }

    //Exposed a stop method.
    public void stopMedia(){
        if(mediaPlayer != null) {
            //Change this accordingly.
            setAudioMediaStatus(AudioMediaStatus.NOT_PLAYED);
            mediaPlayer.stop();
        }
    }

    @Override
    public void processFile(String fileLocation) throws Exception {
        switch (getAudioMediaStatus()) {
            case NOT_PLAYED:
                playMedia(fileLocation);
                break;
            case PLAYING:
                /* TIP:
                If mediaPlayer.stop is placed after the line
                *  media = new Media(new File(fileLocation).toURI().toString());
                    mediaPlayer = new MediaPlayer(media);
                    then multiple music play together when multiple different row gets selected,
                    one after another
                */
                mediaPlayer.stop();
                playMedia(fileLocation);
                break;
            default:
                System.out.println("Audio in default case");
        }
    }

    private void playMedia(String fileLocation) {

        VideoProcesser.getVideoProcesser().stopMedia();
        //Moved the previous statements to its own method.
        setMediaPlayer(fileLocation);
        mediaPlayer.play();
        setAudioMediaStatus(AudioMediaStatus.PLAYING);
    }
}
如您所见,我添加了一些项,即一些方法,并且我去掉了静态导入。需要注意的重要事项是
stopMedia()
方法和
playMedia()
方法中的第一行

stopMedia
方法完全按照名称执行。在
playMedia
方法中,您可以看到我添加了
VideoProcesser.getVideoProcesser().stopMedia()
作为第一行

Audio/VideoProcesser
类几乎是相同的,因此添加的方法和细微的调整会转移过来,我已经测试过了,它确实有效


由于您在选择
txt
文件时也希望停止音频/视频,因此您还需要在该类中添加对视频和音频
stopMedia
方法的相同调用。

是的,我理解。稍后,我将为我的视频处理器添加更多功能,比如录制视频文件的某些部分。即使我将音频和视频处理器合并在一起,另一个问题仍然存在,即在播放音频时,如果单击文本文件,音频将继续播放。我解决这个问题的方法效率很低,我已经更新了这个问题。我实际上在使用一个文件处理器,并将其放在堆栈上,检查之前的文件处理器是否为AudioProcessor类型,然后调用它们各自的processFile()方法并停止它。啊,我明白了。嗯,我试着检查你的代码并重构它,但是我的想法需要太多的修改。也许其他人会有主意你能告诉我你的想法吗?使用实例变量并公开一些方法来停止媒体播放器。不过,我不确定当你启动新线程时,它将如何工作。我在上面睡了一觉,我有了一个解决方案。