이번에는 음악 플레이어를 만들기 때문에 크기를 조금 줄인다.
Main의
Scene scene = new Scene(root,400,200);
400, 200 으로 수정
BorderPane Center 부분에 Pane을 올려 사용
Slider - Code : fx:id - seekBar
MediaView - Code : fx:id - mediaView (모습이 드러나지 않는 노드이기 때문에 아무대나 배치하면 된다.)
Label - Code : fx:id - playList
Label - Code : fx:id - playTime
Button - Code : On Action - open
Button - Code : On Action - play
Button - Code : On Action - pause
Button - Code : On Action - fast
Button - Code : On Action - slow
Button - Code : On Action - start
Button - Code : On Action - last
이번에 만들 Audio Player는 전과 같이 MediaView를 사용하지만 mediaview는 재생하여 소리를 나게 하기 위한 ui로
따로 모습이 필요없다.
고로 아무대나 배치하면 되고 각 버튼을 통해서 선택한 음악의 재생관리를 구현한다.
특별한것은 예전에 배웠던 split이나 (long)과 같은 명시적 형변환 등 쓰이는게 많다.
그리고 버튼 play에 거의 모든 기능이 쓰이므로 play 함수를 유심히 보자.
package app; import java.io.File; import java.net.URL; import java.util.ResourceBundle; import javafx.application.Platform; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.Label; import javafx.scene.control.Slider; import javafx.scene.media.Media; import javafx.scene.media.MediaPlayer; import javafx.scene.media.MediaView; import javafx.stage.FileChooser; import javafx.stage.FileChooser.ExtensionFilter; public class MainController implements Initializable{ @FXML private Slider seekBar; @FXML private Label playList; @FXML private Label playTime; @FXML private MediaView mediaView; Media media; MediaPlayer player; String mediaPath; long totalTime, currentTime; @Override public void initialize(URL location, ResourceBundle resources) { System.out.println("FXML 완"); seekBar.setValueChanging(true); // 외부에서 슬라이더바 조작 가능 seekBar.setValue(0); } public void open() { FileChooser fc = new FileChooser(); fc.setTitle("음악 파일 선택"); fc.setInitialDirectory(new File("C:/")); // 기본 경로 // 확장자 필터링(선택) ExtensionFilter filter = new ExtensionFilter("audio", "*.mp3"); fc.getExtensionFilters().add(filter); File selectedFile = fc.showOpenDialog(null); // 창 위치 및 불러운 파일 삽입 mediaPath = selectedFile.toURI().toString(); System.out.println("선택한 경로 : " + mediaPath); // playList에 재생할 파일명 출력 String[] token = mediaPath.split("/"); // 공백의 경우 %20으로 표시되어 공백으로 바꿔주고 넣는다. String musicName = token[token.length-1].replaceAll("%20", " "); // 리스트에 삽입 playList.setText(musicName); // 미디어 등록 - 플레이어 등록 - 뷰에 등록 media = new Media(mediaPath); player = new MediaPlayer(media); player.setAutoPlay(false); // 자동실행 false, play 버튼을 누를 시 음악이 재생되게끔 mediaView = new MediaView(player); } public void play() { currentTime = 0; totalTime = 0; player.play(); player.setRate(1); // 재생속도 기본 (1), 디폴트값 totalTime = (long) player.getTotalDuration().toSeconds(); // 노래가 몇초짜리인지 반환 System.out.println(totalTime); // 슬라이더를 움직이기 위한 스레드 생성 // 스레드가 별개로 돌아가기 때문에 재생하고 창을 종료하면 계속 재생되는 상태이다. Thread th = new Thread(()-> { while(currentTime < totalTime) { // 재생시간에 따라 스레드 종료 currentTime = (long)player.getCurrentTime().toSeconds(); Platform.runLater(()->{ seekBar.setValue((double)currentTime/totalTime*100); playTime.setText(currentTime + "/" + totalTime); }); // sleep 0.3초를 주어서 좀 더 안정감있게 slidebar를 제어 // 없다면 계산이 너무 빠르기 때문에 불안정 try { Thread.sleep(300); } catch (InterruptedException e) { e.printStackTrace(); } } player.stop(); }); th.start(); } public void pause() { player.pause(); } public void fast() { // 0.5배 빠르거나 느리게, 숫자를 변수로 받아 선언하여 활용 가능 player.setRate(1.5); } public void slow() { player.setRate(0.5); } public void start() { // 첫 시간대로 이동 player.seek(player.getStartTime()); } public void last() { // 마지막 시간대로 이동 player.seek(player.getTotalDuration()); } }
token[token.length-1].replaceAll("%20", " ");
위의 코드에 replaceAll을 사용하지 않으면 띄어쓰기가 %20처럼 이상하게 출력되는것을 방지 할 수 있다.
슬라이더를 통해서 조절하는 여러가지 기능은 직접 만들어보시길... 어렵지않다.
'JavaFX > 01.Node 추가' 카테고리의 다른 글
[JAVA FX]01-17.Popup 띄우기2 (방법2) (0) | 2018.09.12 |
---|---|
[JAVA FX]01-16.Popup 띄우기 (방법 1,2) (0) | 2018.09.12 |
[JAVA FX]01-14.Media Player (0) | 2018.09.11 |
[JAVA FX]01-13.BarChart (0) | 2018.09.11 |
[JAVA FX]01-12.Line Chart, Random (0) | 2018.09.11 |