이번에는 음악 플레이어를 만들기 때문에 크기를 조금 줄인다.


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

+ Recent posts