JavaFX mp3音频、mp4音频、文本数据叠加
我正在开发一个应用程序,可以在不同的文件夹位置查找文件,并在表视图中显示所有文件。如果用户单击一行,则该文件将显示在程序的右侧。目前,它可以处理txt、mp3文件和mp4文件 说明:JavaFX mp3音频、mp4音频、文本数据叠加,java,multithreading,javafx,Java,Multithreading,Javafx,我正在开发一个应用程序,可以在不同的文件夹位置查找文件,并在表视图中显示所有文件。如果用户单击一行,则该文件将显示在程序的右侧。目前,它可以处理txt、mp3文件和mp4文件 说明: 我创建了两个服务,FileSearchService和FilePreviewService。FileSearchService搜索文件并将其添加到静态observableList中。FilePreviewService获取所选行,检查文件类型是否为txt、mp3或其他,并使用FileProcessor抽象类处理所选
我创建了两个服务,FileSearchService和FilePreviewService。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()方法并停止它。啊,我明白了。嗯,我试着检查你的代码并重构它,但是我的想法需要太多的修改。也许其他人会有主意你能告诉我你的想法吗?使用实例变量并公开一些方法来停止媒体播放器。不过,我不确定当你启动新线程时,它将如何工作。我在上面睡了一觉,我有了一个解决方案。