2016-10-26 2 views
2

미디어 플레이어 메서드를 만들었습니다. 시작시 호출되는 javafx입니다 (아래 미디어 플레이어). 내 문제는 내가 드래그하여 스크롤 창과 상호 작용할 때마다 일시 중지되거나 플레이어가 확대/축소되어 일시 중지되고 다시 시작되지 않는다는 것입니다. 왜 이런 경우이며 어떻게 해결할 수 있습니까? (시도해 보려면 전체 응용 프로그램 포함).올바르게 미디어 플레이어를 설정하는 방법 javafx

package minimalist; 

import java.io.File; 
import java.io.IOException; 
import java.nio.file.Files; 
import java.nio.file.Paths; 
import java.util.LinkedList; 
import java.util.List; 
import java.util.Queue; 
import java.util.stream.Collectors; 

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.ScrollPane; 
import javafx.scene.image.Image; 
import javafx.scene.image.ImageView; 
import javafx.scene.layout.StackPane; 
import javafx.scene.media.Media; 
import javafx.scene.media.MediaPlayer; 
import javafx.stage.Stage; 

public class Minimal extends Application{ 

    private static Queue<String> musicList = new LinkedList<String>(); 

    public static void main(String[] args) throws IOException { 
     List<String> result = Files.find(Paths.get(".\\music"), 100, 
       (p, a) -> p.toString().toLowerCase().endsWith(".mp3")) 
       .map(path -> path.toString()) 
       .collect(Collectors.toList()); 
     for(int a = 0; a < result.size(); a++) 
     { 
      musicList.add(result.get(a)); 
     } 
     MusicPlayer(); 
     launch(args); 
    } 

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     ScrollPane scrollpane = new ScrollPane(); 
     Image image = new Image("https://upload.wikimedia.org/wikipedia/commons/7/70/Kusatma_Zonaro.jpg"); 
     ImageView imageView = new ImageView(image); 
     scrollpane.setContent(imageView); 
     scrollpane.setPannable(true); 
     Scene scene = new Scene(new StackPane(scrollpane)); 
     primaryStage.setScene(scene); 
     primaryStage.setFullScreen(true); 
     primaryStage.show(); 
    } 

    private static void MusicPlayer() { 
     if(musicList.peek() == null) 
     { 
      return; 
     } 
     MediaPlayer mediaPlayer = new MediaPlayer(new Media(new File(musicList.poll()).toURI().toString())); 
     mediaPlayer.setOnReady(() -> { 
      mediaPlayer.play(); 
      mediaPlayer.setOnEndOfMedia(() -> { 
       mediaPlayer.dispose(); 
       MusicPlayer(); 
      }); 
     }); 
    } 
} 
+0

여기 좀 https://docs.oracle.com/javafx/2/media/playercontrol.htm 되세요. 아담 당신이 제공하는 코드가 너무 큽니다 .. 그래서 우리는 솔루션을 제공 할 수있는 버그가오고있는 위치를 찾으십시오. 또한 주요 코드를 많이 줄일 fxml와 함께 귀하의 프로젝트를 빌드하려고합니다. – GOXR3PLUS

+0

당신은 [전에] (http://stackoverflow.com/questions/39969156/music-player-pauses-upon-interaction-with-interface-javafx)에게 물어 보려했습니다. 이 작업을 위해 [MCVE]를 만들면 정말 도움이 될 것입니다. 첫 번째 시도는 * complete * 코드를 포함하지 않았습니다. 이 질문의 코드는 분명히 * 최소 *가 아닙니다 (우리가 가지고 있지 않은 자원에 의존하기 때문에 실제로 완료되지는 않습니다). 그래서 음악을 재생할 수있는 코드와 문제를 재연 할 수 있는지 드래그하여 볼 수있는 코드가있는 새로운 프로젝트를 만드십시오. 그런 다음 문제를 보여주는 가장 작은 완전한 응용 프로그램을 게시하십시오. –

+0

@ GoXR3Plus 그래, 나는 이것을 게시하기 전에 그것을 보았다. 그리고 그것은 끔찍하게 유용하지 않았다. 아래는 프로젝트를 만들고 mp3 파일이 들어있는 music이라는 소스 폴더를 추가하는 것입니다. –

답변

2

private static void MusicPlayer() { 
    if(musicList.peek() == null) 
    { 
     return; 
    } 
    MediaPlayer mediaPlayer = new MediaPlayer(new Media(new File(musicList.poll()).toURI().toString())); 
    mediaPlayer.setOnReady(() -> { 
     mediaPlayer.play(); 
     mediaPlayer.setOnEndOfMedia(() -> { 
      mediaPlayer.dispose(); 
      MusicPlayer(); 
     }); 
    }); 
} 

최소

방법 (라이브 코드)이 모두 깨지기 쉬운 방식의 뭔가 행동을 보인다.

main 방법으로 미디어 플레이어를 시작하는 것을 권장하지 않습니다. 이 문서는 MediaPlayer에 대한 스레딩 정책에 약간 부족한 것이지만 일반적인 JavaFX 응용 프로그램을 시작하기 때문에 일반적인 규칙을 따르고 JavaFX 응용 프로그램 스레드에서만 메서드를 호출하는 것이 좋습니다. 내 시스템에서 나는 당신이 설정 한대로 음악을 재생할 수 없었습니다.

또한 변경 후 재생을 시작하는 산발적 인 문제가있었습니다. 아마도 시스템 리소스를 종료 한 후에 묶어 두었을 것이라고 추측 했으므로 애플리케이션을 종료했을 때 플레이어가 폐기되었는지 확인하기 위해 코드를 수정했습니다. 두 변경 후 예상대로 작동합니다. 아무리해도 사용자 입력과 관련된 문제는 없었습니다. 내 생각 엔 이들이 FX 응용 프로그램 스레드 대신 메인 스레드에서 미디어 플레이어를 시작하여 발생하며 시스템에 따라 다를 수 있습니다.

나를 위해 잘 작동하는 코드는 다음과 같습니다. 또한 코드의 중복성 중 일부를 정리하여 (Path을 통해 String으로 변환 한 다음 File으로 다시 변환하여 URL의 문자열 표현으로 변환 할 수 있으므로 다소 간결하게 보일 수도 있음) 가) 적절한 naming conventations을 준수하도록 불필요한 그 과정에서 목록 등)는 일을 이름 :

import java.io.IOException; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.util.LinkedList; 
import java.util.Queue; 

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.ScrollPane; 
import javafx.scene.image.Image; 
import javafx.scene.image.ImageView; 
import javafx.scene.layout.StackPane; 
import javafx.scene.media.Media; 
import javafx.scene.media.MediaPlayer; 
import javafx.stage.Stage; 

public class Minimal extends Application{ 

    private Queue<Path> musicList = new LinkedList<>(); 

    private MediaPlayer mediaPlayer ; 

    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage primaryStage) throws Exception { 

     // Everyone should have this album. Edit the path if your musical taste is poor. 
     Files.find(Paths.get(System.getProperty("user.home"),"Music/iTunes/iTunes Media/Music/Thievery Corporation/Saudade/"), 100, 
       (p, a) -> p.toString().toLowerCase().endsWith(".m4a")) 
       .forEach(musicList::add); 

     playMusic(); 

     ScrollPane scrollpane = new ScrollPane(); 
     Image image = new Image("https://upload.wikimedia.org/wikipedia/commons/7/70/Kusatma_Zonaro.jpg"); 
     ImageView imageView = new ImageView(image); 
     scrollpane.setContent(imageView); 
     scrollpane.setPannable(true); 
     Scene scene = new Scene(new StackPane(scrollpane)); 
     primaryStage.setScene(scene); 
     primaryStage.setFullScreen(true); 
     primaryStage.show(); 

    } 

    @Override 
    public void stop() { 
     if (mediaPlayer != null) { 
      mediaPlayer.stop(); 
      mediaPlayer.dispose(); 
     } 
    } 

    private void playMusic() { 
     if(musicList.peek() == null) 
     { 
      return; 
     } 
     mediaPlayer = new MediaPlayer(new Media(musicList.poll().toUri().toString())); 
     mediaPlayer.setOnReady(() -> { 
      mediaPlayer.play(); 
      mediaPlayer.setOnEndOfMedia(() -> { 
       mediaPlayer.dispose(); 
       playMusic(); 
      }); 
     }); 

    } 
} 
+0

예, 이것은 분명히 나쁜 음악적 취향을 가지고 있습니다.이전에 나는 start 메소드로 코드를 옮겨 보았지만, 그것을 시도했을 때 아무 것도 바뀌지 않았다. 그래서 나는 그것을 main 메소드로 다시 옮겼다. –

관련 문제