2017-02-06 8 views
3

제 친구와 저는 미디어 프로젝트, 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; 
    } 
} 
+2

파일 :/C : /Users/mewww/Google%20Drive/Java/SmartPlay/EXO-MonsterMV.mp4 "'당신이 실제로 얻은 것 또는 내가 본 것으로 생각한 것만 있습니까? 그리고 전자의 경우 왜 인용 부호입니까? 나머지 스택 추적을 제공하십시오. – EJP

+0

정확하게 콘솔 로그에 출력 된 것이므로 인용 부호를 사용하여이를 문자열로 식별했습니다. –

+0

그리고 그 문자열을 수정 한 실제 결과는 무엇입니까? – EJP

답변

1

그래서 명령 줄에서 코드를 실행했는데보다 구체적인 디버그 오류를 얻을 수있었습니다. 따라서 MediaBar에서 시간 형식을 지정하면 오류가 발생하는 것 같습니다. 나는 당신이 그걸로 무엇을하려하는지 정확히 모르지만 당신이 시간을 형식화하는 방식이 정확하지 않습니다. 시간 서식을 추가하는 데 사용하는 다른 것들뿐만 아니라 주석을 달아 URI 경로가 정확하고 비디오가 제대로 실행되어야합니다. 나는 형식에 대해 '% 02d'가 누락되었음을 알고 있습니다. 당신이 포맷하는 것에 관해서는 너무 확신 할 수 없기 때문에 거기에서 당신을 도울 수 없습니다.

+0

나는 당신이하고 싶은 것이 java.time과 Duration 클래스에있는 toMinutes()와 toSeconds()를 사용하는 것이 더 쉽다고 생각한다. 이렇게하면 전환하는 데 도움이되며 원하는대로 형식을 지정할 수 있습니다. – mkahihu