2016-06-01 4 views
1

なぜこれが起こっているのか分かりません。私はできることをすべて試しましたが、startメソッドの中にdo whileループを追加すると、以下は動作しません。これは意味をなさない。私は音を反復することはできません。私は何も気にしません。私の音が再生されないようにする単純なループです。JavaFXのmediaplayerはdoメソッドでは動作しませんwhileループはstartメソッド内でループします。

なぜですか?私は別のスレッドでオーディオを開始する必要がありますか?もしそうなら、どのように?

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

次のJava FXのAPIを理解しておく必要があります。それはあなたがトンを研究するために役立つだろう

  1. Media

  2. MediaPlayer

  3. MediaView

彼はIncorporating Media Assets Into JavaFX Applicationsというタイトルのチュートリアルスレッドです。言われていること

、次SSCCEは唯一の変更は、私はチュートリアルで提供さMEDIA_URLの値をコメントアウトして、OPで指定されているよう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); 
     } 
     } 
    } 
    } 
} 
あなたの元の質問のコードを使用して

EDIT

、これにstartメソッドを交換してください:

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

その後、MIPAとして既に回答:

はJavaFXの並行性についてのチュートリアルをお読みください。

+0

私は非常に視覚的な学習者です。このチュートリアルのコードは非常に肥大しており、理解するのが少し難しくなっています。私の質問で提供したコードを使って例を示すことができますか? – Asperger

+0

私はRunnableを使ってそれを別のスレッドに入れることができました – Asperger

関連する問題