2016-06-01 1 views
1

왜 이런 일이 발생하는지 잘 모르겠습니다. 내가 할 수있는 모든 것을 시도했지만, 아래에 시작 메소드 안에 do while 루프를 추가하면 작동하지 않을 것이다. 이 doesnt는 이해된다. 나는 소리를 반복하지 않는다는 것을 의미한다.() 나는 아무것도 할 수 없다. 나는 내 소리가 재생되는 것을 막는 단순한 루프이다.JavaFX 미디어 플레이어가 do not와 함께 작동하지 않습니다 while while start method;

왜 그럴까요? 오디오를 별도의 스레드에서 시작해야 할 수도 있습니까? 그렇다면 어떻게?

import java.io.File; 

import javafx.application.Application; 
import javafx.scene.media.Media; 
import javafx.scene.media.MediaPlayer; 
import javafx.stage.Stage; 

public class SoundTest extends Application{ 
public static void main(String[] args) { 
    launch(args); 
} 

    @Override 
    public void start(Stage arg0) throws Exception { 
     sound(); 
     do { 

     } 
     while(true); 
    } 

    public static void sound() { 
     String path = "test.mp3"; 
     Media media = new Media(new File(path).toURI().toString()); 
     MediaPlayer mediaPlayer = new MediaPlayer(media); 
     mediaPlayer.play(); 
    } 
} 
+0

그건 무한 루프입니다. 예외는 없어야합니까? –

+0

나는 어떤 예외도 얻지 않는다. 사실 변수를 통해 루프의 상태를 제어 할 것입니다. 사용자가 입력하면 루프가 중지됩니다. 그러나 내 프로그램을 계속 실행하려면 루프가 필요합니다 (tui 기반 응용 프로그램이 있습니다). 나는 미니멀리즘을 유지하고 여기에 비어있는 도구를 놓았다. 오디오와 조합하여 어떻게 든 작동하지 않는다는 것을 보여 주기만하면된다. – Asperger

답변

2

루프가 JavaFX 응용 프로그램 스레드를 차단하고 있습니다. JavaFX에서 게임 루프처럼 보이는 것을 사용하는 것이 가장 확실하게 틀리며 작동하지 않습니다. JavaFX 동시성에 대한 자습서를 읽으십시오.

0

다음과 같은 자바 FX API에 익숙해 져야합니다 : 그것은 당신이 t을 연구하기 위해 도움이 될

  1. Media

  2. MediaPlayer

  3. MediaView

튜토리얼 스레드는 Incorporating Media Assets Into JavaFX Applications입니다.

말했다되고 그건

다음 SSCCE 당신이 영업 이익에 지정된대로 내가 튜토리얼에서 제공하는 MEDIA_URL의 값에서 주석과 new File("test.mp3").toURI().toASCIIString()로 대체하는 유일한 수정되는으로 그 튜토리얼에서 온다 :

import java.io.File; 
import javafx.application.Application; 
import javafx.application.Platform; 
import javafx.geometry.Insets; 
import javafx.geometry.Pos; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.control.Slider; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.Pane; 
import javafx.scene.layout.Priority; 
import javafx.scene.layout.Region; 
import javafx.scene.media.Media; 
import javafx.scene.media.MediaPlayer; 
import static javafx.scene.media.MediaPlayer.Status.HALTED; 
import static javafx.scene.media.MediaPlayer.Status.PAUSED; 
import static javafx.scene.media.MediaPlayer.Status.READY; 
import static javafx.scene.media.MediaPlayer.Status.STOPPED; 
import static javafx.scene.media.MediaPlayer.Status.UNKNOWN; 
import javafx.scene.media.MediaView; 
import javafx.stage.Stage; 
import javafx.util.Duration; 

public class SoundTest extends Application { 

// private static final String MEDIA_URL = "http://download.oracle.com/otndocs/products/javafx/oow2010-2.flv"; 
    private static final String MEDIA_URL = new File("test.mp3").toURI().toASCIIString(); 

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

    @Override 
    public void start(Stage primaryStage) throws Exception { 
    primaryStage.setTitle("Embedded Media Player"); 
    Group root = new Group(); 
    Scene scene = new Scene(root, 540, 241); 

    // create media player 
    Media media = new Media(MEDIA_URL); 
    MediaPlayer mediaPlayer = new MediaPlayer(media); 
    mediaPlayer.setAutoPlay(true); 
    MediaControl mediaControl = new MediaControl(mediaPlayer); 
    scene.setRoot(mediaControl); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 

    } 

    static class MediaControl extends BorderPane { 
    private MediaPlayer mp; 
    private MediaView mediaView; 
    private final boolean repeat = false; 
    private boolean stopRequested = false; 
    private boolean atEndOfMedia = false; 
    private Duration duration; 
    private Slider timeSlider; 
    private Label playTime; 
    private Slider volumeSlider; 
    private HBox mediaBar; 

    public MediaControl(final MediaPlayer mp) { 
     this.mp = mp; 
     setStyle("-fx-background-color: #bfc2c7;"); 
     mediaView = new MediaView(mp); 
     Pane mvPane = new Pane() { 
     }; 

     mvPane.getChildren().add(mediaView); 
     mvPane.setStyle("-fx-background-color: black;"); 
     setCenter(mvPane); 

     mediaBar = new HBox(); 
     mediaBar.setAlignment(Pos.CENTER); 
     mediaBar.setPadding(new Insets(5, 10, 5, 10)); 
     BorderPane.setAlignment(mediaBar, Pos.CENTER); 

     final Button playButton = new Button(">"); 
     playButton.setOnAction(e -> { 
     MediaPlayer.Status status = mp.getStatus(); 
     if (status == UNKNOWN || status == HALTED) { 
      // don't do anything in these states 
      return; 
     } 

     if (status == PAUSED 
      || status == READY 
      || status == STOPPED) { 
      // rewind the movie if we're sitting at the end 
      if (atEndOfMedia) { 
      mp.seek(mp.getStartTime()); 
      atEndOfMedia = false; 
      } 
      mp.play(); 
     } else { 
      mp.pause(); 
     } 
     }); 
     mp.currentTimeProperty().addListener(ov -> { 
     updateValues(); 
     }); 

     mp.setOnPlaying(() -> { 
     if (stopRequested) { 
      mp.pause(); 
      stopRequested = false; 
     } else { 
      playButton.setText("||"); 
     } 
     }); 

     mp.setOnPaused(() -> { 
     System.out.println("onPaused"); 
     playButton.setText(">"); 
     }); 

     mp.setOnReady(() -> { 
     duration = mp.getMedia().getDuration(); 
     updateValues(); 
     }); 

     mp.setCycleCount(repeat ? MediaPlayer.INDEFINITE : 1); 
     mp.setOnEndOfMedia(new Runnable() { 
     public void run() { 
      if (!repeat) { 
      playButton.setText(">"); 
      stopRequested = true; 
      atEndOfMedia = true; 
      } 
     } 
     }); 
     mediaBar.getChildren().add(playButton); 
     // Add spacer 
     Label spacer = new Label(" "); 
     mediaBar.getChildren().add(spacer); 

     // Add Time label 
     Label timeLabel = new Label("Time: "); 
     mediaBar.getChildren().add(timeLabel); 

     // Add time slider 
     timeSlider = new Slider(); 
     HBox.setHgrow(timeSlider, Priority.ALWAYS); 
     timeSlider.setMinWidth(50); 
     timeSlider.setMaxWidth(Double.MAX_VALUE); 
     timeSlider.valueProperty().addListener(ov -> { 
     if (timeSlider.isValueChanging()) { 
      // multiply duration by percentage calculated by slider position 
      mp.seek(duration.multiply(timeSlider.getValue()/100.0)); 
     } 
     }); 
     mediaBar.getChildren().add(timeSlider); 

     // Add Play label 
     playTime = new Label(); 
     playTime.setPrefWidth(130); 
     playTime.setMinWidth(50); 
     mediaBar.getChildren().add(playTime); 

     // Add the volume label 
     Label volumeLabel = new Label("Vol: "); 
     mediaBar.getChildren().add(volumeLabel); 

     // Add Volume slider 
     volumeSlider = new Slider(); 
     volumeSlider.setPrefWidth(70); 
     volumeSlider.setMaxWidth(Region.USE_PREF_SIZE); 
     volumeSlider.setMinWidth(30); 
     volumeSlider.valueProperty().addListener(ov -> { 
     if (volumeSlider.isValueChanging()) { 
      mp.setVolume(volumeSlider.getValue()/100.0); 
     } 
     }); 
     mediaBar.getChildren().add(volumeSlider); 
     setBottom(mediaBar); 
    } 

    protected void updateValues() { 
     if (playTime != null && timeSlider != null && volumeSlider != null) { 
     Platform.runLater(() -> { 
      Duration currentTime = mp.getCurrentTime(); 
      playTime.setText(formatTime(currentTime, duration)); 
      timeSlider.setDisable(duration.isUnknown()); 
      if (!timeSlider.isDisabled() 
      && duration.greaterThan(Duration.ZERO) 
      && !timeSlider.isValueChanging()) { 
      timeSlider.setValue(currentTime.divide(duration).toMillis() * 100.0); 
      } 
      if (!volumeSlider.isValueChanging()) { 
      volumeSlider.setValue((int) Math.round(mp.getVolume() * 100)); 
      } 
     }); 
     } 
    } 

    private static String formatTime(Duration elapsed, Duration duration) { 
     int intElapsed = (int) Math.floor(elapsed.toSeconds()); 
     int elapsedHours = intElapsed/(60 * 60); 
     if (elapsedHours > 0) { 
     intElapsed -= elapsedHours * 60 * 60; 
     } 
     int elapsedMinutes = intElapsed/60; 
     int elapsedSeconds = intElapsed - elapsedHours * 60 * 60 - elapsedMinutes * 60; 

     if (duration.greaterThan(Duration.ZERO)) { 
     int intDuration = (int) Math.floor(duration.toSeconds()); 
     int durationHours = intDuration/(60 * 60); 
     if (durationHours > 0) { 
      intDuration -= durationHours * 60 * 60; 
     } 
     int durationMinutes = intDuration/60; 
     int durationSeconds = intDuration - durationHours * 60 * 60 - durationMinutes * 60; 
     if (durationHours > 0) { 
      return String.format("%d:%02d:%02d/%d:%02d:%02d", elapsedHours, elapsedMinutes, elapsedSeconds, durationHours, durationMinutes, durationSeconds); 
     } else { 
      return String.format("%02d:%02d/%02d:%02d", elapsedMinutes, elapsedSeconds, durationMinutes, durationSeconds); 
     } 
     } else { 
     if (elapsedHours > 0) { 
      return String.format("%d:%02d:%02d", elapsedHours, elapsedMinutes, elapsedSeconds); 
     } else { 
      return String.format("%02d:%02d", elapsedMinutes, elapsedSeconds); 
     } 
     } 
    } 
    } 
} 
원래 문제의 코드를 사용하여

편집

이와 시작 방법을 교체해보십시오 :

@Override 
    public void start(Stage arg0) throws Exception { 
    sound(); 
// do { 
// } 
// while (true); 
    } 

그런 다음, MIPA로 이미 대답

은 자바 FX 동시성에 대한 자습서를 읽어보십시오.

+0

Im 매우 시각적 인 학습자. 이 자습서의 코드는 매우 비대 해져서 이해하기가 더 힘듭니다. 내 질문에 제공 한 코드 예제를 보여줄 수 있습니까? – Asperger

+0

Runnable을 사용하여 별도의 스레드에 넣을 수 있습니다. – Asperger