제 친구와 저는 미디어 프로젝트, MediaPlayer 및 MediaView 클래스를 사용하여 간단한 미디어 플레이어를 만드는 Java 프로젝트 작업을하고 있습니다. 그러나 처음부터 우리가 테스트 파일로 사용하고있는 비디오를 성공적으로 여는 데 문제가있었습니다. 많은 분노한 런타임 예외가 발생한 후에 우리는 문제의 근원이 각 객체에 전달되는 문자열이라는 것을 알게되었습니다 (Media는 URI 경로로 파일 경로를 나타내는 문자열이 필요합니다). 일부 수정 후, 우리는 다음과 같은 URI가 파일 열기를 내 컴퓨터에 일을 발견 : 그러나URI 구문 및 문자열 변환의 어려움
Media m = new Media("file:///C:/Users/mewww/Google%20Drive/Java/SmartPlay/EXO-MonsterMV.mp4");
MediaPlayer mp = new MediaPlayer(m);
MediaView mv = new MediaView(mp);
을, 우리는 나중에 사용자가 선택할 수 있도록 할 오픈 방법을 구현하기 위해 노력 File 객체로하는 파일 () 그들은 놀고 싶었다. 우리가 이런 짓을 할 때, 우리는 파일을 열려면 다음을 사용 :
File currentFile = new File(null);
FileChooser fc = new FileChooser();
fc.setTitle("Open");
currentFile = fc.showOpenDialog(null);
Media m = new Media(currentFile.toURI().toString());
MediaPlayer mp = new MediaPlayer(m);
MediaView mv = new MediaView(mp);
이 우리가 다시 예외를 런타임주고 시작하고 그래서 우리는 문제가 무엇인지 알아 콘솔에에 println을 사용했다.
"file:/C:/Users/mewww/Google%20Drive/Java/SmartPlay/EXO-MonsterMV.mp4"
그러나, 문자열을 수정 한 후, 우리는 여전히 즉시 파일이 선택되었을 때 같은 런타임 오류가 발생 : 사용되는 문자열은이 같은해야했는데 지금의이 "/"의 짧은이야이었다 :
Exception in Application start method
java.lang.RuntimeException: Exception in Application start method
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(LauncherImpl.java:182)
그런 다음 전체 Open 메서드를 주석 처리하고 원래 코드로 돌아 갔지만 동일한 오류가 계속 발생합니다.
우리의 전체 코드는 여기에 있습니다 :
SmartPlay 클래스
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.scene.paint.Color;
import java.io.File;
import javafx.stage.FileChooser;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.application.Platform;
public class SmartPlay extends Application {
File currentFile;
Scene scene;
@Override
public void start(Stage primary) {
primary.setTitle("SmartPlay");
selectCurrentFileToOpen();
//Player(currentFile.toURI().toString().substring(0,5)+"//"+currentFile.toURI().toString().substring(5));
Player player = new Player("file:///C:/Users/mewww/Google%20Drive/Java/SmartPlay/EXOMonsterMV.mp4");
scene = new Scene(player, 720, 480, Color.BLACK);
player.setTop(makeMenus());
primary.setScene(scene);
primary.show();
}
private MenuBar makeMenus() {
MenuBar mb = new MenuBar();
Menu fileMenu = new Menu("File");
MenuItem openItem = new MenuItem("Open...");
openItem.setOnAction(e -> {
selectCurrentFileToOpen();
scene.setRoot(new Player(currentFile.toURI()));
});
MenuItem quitItem = new MenuItem("Quit");
quitItem.setOnAction(e -> Platform.exit());
fileMenu.getItems().addAll(openItem, quitItem);
return mb;
}
public boolean selectCurrentFileToOpen() {
FileChooser fc = new FileChooser();
fc.setTitle("Open");
currentFile = fc.showOpenDialog(null);
return true;
}
public void stop() {
}
public static void main(String[] args) {
launch(args);
}
}
플레이어 클래스
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaView;
import java.net.URI;
public class Player extends BorderPane {
Media m;
MediaPlayer mp;
MediaView mv;
Pane p;
MediaBar bar;
public Player(String file) {
m = new Media(file);
mp = new MediaPlayer(m);
mv = new MediaView(mp);
p = new Pane();
p.getChildren().addAll(mv);
setCenter(p);
bar = new MediaBar(mp);
setBottom(bar);
setStyle("-fx-background-color:#cccccc");
mp.play();
}
}
미디어 바 클래스
import javafx.scene.layout.HBox;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.media.MediaPlayer;
import javafx.scene.layout.Priority;
import javafx.scene.control.Slider;
import javafx.scene.control.Label;
import javafx.scene.control.Button;
import javafx.util.Duration;
public class MediaBar extends HBox {
Slider time = new Slider();
Slider vol = new Slider();
Button playButton = new Button("Pause");
Button halfSpeed = new Button("0.5x");
Button normalSpeed = new Button("1.0x");
Button doubleSpeed = new Button("2.0x");
Label volume = new Label("Volume: ");
Label nowTime;
MediaPlayer player;
public MediaBar(MediaPlayer play) {
player = play;
setAlignment(Pos.CENTER);
setPadding(new Insets(5,10,5,10));
vol.setPrefWidth(70);
vol.setMinWidth(30);
vol.setValue(100);
nowTime = new Label(formatTime(player.getCurrentTime()) + "/" + formatTime(player.getTotalDuration()));
HBox.setHgrow(time, Priority.ALWAYS);
playButton.setPrefWidth(30);
getChildren().addAll(playButton,time,nowTime,volume,vol);
}
public static String formatTime(Duration duration) { //StackOverflow: Jon Skeet
long seconds = (long) duration.toSeconds();
long absSeconds = Math.abs(seconds);
String positive = String.format(
"%d:%02d:%02d",
//absSeconds/3600,
(absSeconds % 3600)/60,
absSeconds % 60);
return seconds < 0 ? "-" + positive : positive;
}
}
파일 :/C : /Users/mewww/Google%20Drive/Java/SmartPlay/EXO-MonsterMV.mp4 "'당신이 실제로 얻은 것 또는 내가 본 것으로 생각한 것만 있습니까? 그리고 전자의 경우 왜 인용 부호입니까? 나머지 스택 추적을 제공하십시오. – EJP
정확하게 콘솔 로그에 출력 된 것이므로 인용 부호를 사용하여이를 문자열로 식별했습니다. –
그리고 그 문자열을 수정 한 실제 결과는 무엇입니까? – EJP