JAVA chapter17. javaFX. 17.7 JavaFX 컨트롤(2)
JAVA/CONCEPT 2018. 1. 19. 13:41 |17.7.4 미디어 컨트롤
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | package sec07.exam04_mediaview; import java.net.URL; import java.util.ResourceBundle; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.Button; import javafx.scene.image.ImageView; import javafx.scene.media.Media; import javafx.scene.media.MediaPlayer; import javafx.scene.media.MediaView; public class RootController implements Initializable { @FXML private MediaView mediaView; @FXML private ImageView imageView; @FXML private Button btnPlay; @FXML private Button btnPause; @FXML private Button btnStop; private boolean endOfMedia; // 재생 완료를 확인하는 플래그 필드 // True 또는 False? @Override public void initialize(URL location, ResourceBundle resources) { //미디어 객체 생성 //Media media = new Media(getClass().getResource("media/video.m4v").toString()); Media media = new Media(getClass().getResource("media/audio.wav").toString()); //미디어 플레이어 생성 및 미디어 뷰에 설정 MediaPlayer mediaPlayer = new MediaPlayer(media); mediaView.setMediaPlayer(mediaPlayer); //해당 상태가 되면 실행할 Runnable 설정 mediaPlayer.setOnReady(new Runnable() { // Ready 상태가 될때 실행 @Override public void run() { btnPlay.setDisable(false); btnPause.setDisable(true); btnStop.setDisable(true); if(mediaPlayer.isAutoPlay()) {mediaView.setVisible(false);} } }); mediaPlayer.setOnPlaying(()->{ // Playing 상태가 될 때 실행 btnPlay.setDisable(true); btnPause.setDisable(false); btnStop.setDisable(false); }); mediaPlayer.setOnPaused(()->{ // Paused 상태가 될 때 실행 btnPlay.setDisable(false); btnPause.setDisable(true); btnStop.setDisable(false); }); mediaPlayer.setOnEndOfMedia(()->{ // EndOfMedia상태가 될 때 실행 endOfMedia = true; // btnPlay.setDisable(false); btnPause.setDisable(true); btnStop.setDisable(true); }); mediaPlayer.setOnStopped(()->{ // Stopped 상태가 될 때 실행 mediaPlayer.seek(mediaPlayer.getStartTime()); btnPlay.setDisable(false); btnPause.setDisable(true); btnStop.setDisable(true); }); //버튼 ActionEvent 처리 btnPlay.setOnAction(event->{ if(endOfMedia) { // EndOfMedia 상태일 경우 mediaPlayer.stop(); // 재생 중지 mediaPlayer.seek(mediaPlayer.getStartTime()); // 재생 시간을 처음으로 돌림 } mediaPlayer.play(); // 미디어 재생 endOfMedia = false; // }); btnPause.setOnAction(event->mediaPlayer.pause()); // 미디어 일시 정지 btnStop.setOnAction(event->mediaPlayer.stop()); // 미디어 중지 } } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | <?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.layout.*?> <?import javafx.scene.media.*?> <?import javafx.scene.image.*?> <?import javafx.scene.control.*?> <AnchorPane xmlns:fx="http://javafx.com/fxml" fx:controller="sec07.exam05_slider_progressbar.RootController" prefHeight="220.0" prefWidth="530.0" > <children> <StackPane layoutX="10.0" layoutY="10.0"> <children> <ImageView fx:id="imageView" fitHeight="200.0" fitWidth="360.0" preserveRatio="false"> <image><Image url="@media/audio.png" /></image> </ImageView> <MediaView fx:id="mediaView" fitHeight="200.0" fitWidth="360.0" preserveRatio="false" /> </children> </StackPane> <Button fx:id="btnPlay" layoutX="385.0" layoutY="15.0" prefHeight="23.0" prefWidth="131.0" text="재생" /> <Button fx:id="btnPause" layoutX="385.0" layoutY="39.0" prefHeight="23.0" prefWidth="131.0" text="멈춤"/> <Button fx:id="btnStop" layoutX="385.0" layoutY="63.0" prefHeight="23.0" prefWidth="131.0" text="중지"/> <Label layoutX="387.0" layoutY="101.0" text="시간" /> <ProgressBar fx:id="progressBar" layoutX="385.0" layoutY="121.0" prefHeight="18.0" prefWidth="98.0" progress="0.0" /> <ProgressIndicator fx:id="progressIndicator" layoutX="489.0" layoutY="112.0" prefHeight="47.0" prefWidth="31.0" progress="0.0" /> <Label fx:id="labelTime" alignment="CENTER" layoutX="386.0" layoutY="142.0" prefHeight="18.0" prefWidth="98.0" text="0/0 sec" /> <Label layoutX="385.0" layoutY="169.0" text="소리" /> <Slider fx:id="sliderVolume" layoutX="385.0" layoutY="187.0" prefHeight="14.0" prefWidth="131.0" showTickMarks="true"/> </children> </AnchorPane> | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | package sec07.exam05_slider_progressbar; import java.net.URL; import java.util.ResourceBundle; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.ProgressBar; import javafx.scene.control.ProgressIndicator; import javafx.scene.control.Slider; import javafx.scene.image.ImageView; import javafx.scene.media.Media; import javafx.scene.media.MediaPlayer; import javafx.scene.media.MediaView; import javafx.util.Duration; public class RootController implements Initializable { @FXML private MediaView mediaView; @FXML private ImageView imageView; @FXML private Button btnPlay; @FXML private Button btnPause; @FXML private Button btnStop; @FXML private Label labelTime; @FXML private Slider sliderVolume; @FXML private ProgressBar progressBar; @FXML private ProgressIndicator progressIndicator; private boolean endOfMedia; @Override public void initialize(URL location, ResourceBundle resources) { //미디어 객체 생성 Media media = new Media(getClass().getResource("media/video.mp4").toString()); //Media media = new Media(getClass().getResource("media/audio.wav").toString()); //미디어 플레이어 생성 및 미디어 뷰에 설정 MediaPlayer mediaPlayer = new MediaPlayer(media); mediaView.setMediaPlayer(mediaPlayer); //해당 상태가 되면 실행할 Runnable 설정 mediaPlayer.setOnReady(new Runnable() { @Override public void run() { mediaPlayer.currentTimeProperty().addListener(new ChangeListener<Duration>() { @Override public void changed(ObservableValue<? extends Duration> observable, Duration oldValue, Duration newValue) { double progress = mediaPlayer.getCurrentTime().toSeconds() / mediaPlayer.getTotalDuration().toSeconds(); progressBar.setProgress(progress); progressIndicator.setProgress(progress); labelTime.setText( (int)mediaPlayer.getCurrentTime().toSeconds()+"/"+ (int)mediaPlayer.getTotalDuration().toSeconds()+" sec"); } }); btnPlay.setDisable(false); btnPause.setDisable(true); btnStop.setDisable(true); if(mediaPlayer.isAutoPlay()) {mediaView.setVisible(false);} } }); mediaPlayer.setOnPlaying(()->{ btnPlay.setDisable(true); btnPause.setDisable(false); btnStop.setDisable(false); }); mediaPlayer.setOnPaused(()->{ btnPlay.setDisable(false); btnPause.setDisable(true); btnStop.setDisable(false); }); mediaPlayer.setOnEndOfMedia(()->{ progressBar.setProgress(1.0); // 미디어 재생이 완료되었을 때 progrees의 속성값을 1.0으로 설정 progressIndicator.setProgress(1.0); // (강제적으로 완료를 시켜야됨, 51.9999로 되면서 완료가 안될 수 도 있어서) endOfMedia = true; btnPlay.setDisable(false); btnPause.setDisable(true); btnStop.setDisable(true); }); mediaPlayer.setOnStopped(()->{ btnPlay.setDisable(false); btnPause.setDisable(true); btnStop.setDisable(true); }); //볼륨설정 sliderVolume.valueProperty().addListener(new ChangeListener<Number>() { @Override public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) { mediaPlayer.setVolume(sliderVolume.getValue() / 100.0); } // sliderVolume.getValue의 범위는 0.0 ~ 100.0 이지만 mediaPlayer.setVolume의 범위는 0.0 ~ 1.0이므로 (/ 100.0) 을 해준다 }); sliderVolume.setValue(50.0); // Slider의 초깃값 (0.5가 된다) //버튼 이벤트 처리 btnPlay.setOnAction(event->{ if(endOfMedia) { mediaPlayer.stop(); mediaPlayer.seek(mediaPlayer.getStartTime()); } mediaPlayer.play(); endOfMedia = false; }); btnPause.setOnAction(event->mediaPlayer.pause()); btnStop.setOnAction(event->mediaPlayer.stop()); } } | cs |
17.7.5 차트 컨트롤
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | <?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.chart.*?> <?import java.lang.*?> <?import javafx.geometry.*?> <?import javafx.scene.layout.*?> <?import javafx.scene.control.*?> <HBox xmlns:fx="http://javafx.com/fxml" fx:controller="sec07.exam06_chart.RootController" prefHeight="250" prefWidth="850" > <children> <PieChart fx:id="pieChart" /> // PieChart 배치 <BarChart fx:id="barChart"> // BarChart 배치 <xAxis> <CategoryAxis side="BOTTOM" /> </xAxis> <yAxis> <NumberAxis side="LEFT" /> </yAxis> </BarChart> <AreaChart fx:id="areaChart"> // AreaChart 배치 <xAxis> <CategoryAxis side="BOTTOM" /> </xAxis> <yAxis> <NumberAxis side="LEFT" /> </yAxis> </AreaChart> </children> </HBox> | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | package sec07.exam06_chart; import java.net.URL; import java.util.ResourceBundle; import javafx.collections.FXCollections; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.chart.AreaChart; import javafx.scene.chart.BarChart; import javafx.scene.chart.PieChart; import javafx.scene.chart.XYChart; public class RootController implements Initializable { @FXML private PieChart pieChart; @FXML private BarChart barChart; @FXML private AreaChart areaChart; @Override public void initialize(URL location, ResourceBundle resources) { pieChart.setData(FXCollections.observableArrayList( // PieChart 데이터 설정 new PieChart.Data("AWT", 10), new PieChart.Data("Swing", 30), new PieChart.Data("SWT", 25), new PieChart.Data("JavaFX", 35) )); XYChart.Series series1 = new XYChart.Series(); // 시리즈 1 생성 series1.setName("남자"); series1.setData(FXCollections.observableArrayList( new XYChart.Data("2015", 70), new XYChart.Data("2016", 40), new XYChart.Data("2017", 50), new XYChart.Data("2018", 30) )); XYChart.Series series2 = new XYChart.Series(); // 시리즈 2 생성 series2.setName("여자"); series2.setData(FXCollections.observableArrayList( new XYChart.Data("2015", 30), new XYChart.Data("2016", 60), new XYChart.Data("2017", 50), new XYChart.Data("2018", 60) )); barChart.getData().add(series1); // 시리즈 1 차트에 추가 barChart.getData().add(series2); // 시리즈 2 차트에 추가 XYChart.Series series3 = new XYChart.Series(); // 시리즈 3 생성 series3.setName("평균온도"); series3.setData(FXCollections.observableArrayList( new XYChart.Data("2015", 13), new XYChart.Data("2016", 6), new XYChart.Data("2017", 22), new XYChart.Data("2018", 19) )); areaChart.getData().add(series3); // 시리즈 3을 차트에 추가 } } | cs |
'JAVA > CONCEPT' 카테고리의 다른 글
JAVA chapter17. javaFX. 17.10 JavaFX CSS 스타일(3) (0) | 2018.01.21 |
---|---|
JAVA chapter17. javaFX. 17.10 JavaFX CSS 스타일(2) (0) | 2018.01.21 |
JAVA chapter19. NIO 기반 입출력 및 네트워킹. 19.9 UDP 채널 (0) | 2018.01.17 |
JAVA chapter19. NIO 기반 입출력 및 네트워킹. 19.8 TCP 비동기 채널 (0) | 2018.01.17 |
JAVA chapter19. NIO 기반 입출력 및 네트워킹. 19.7 TCP 넌블로킹 채널 (0) | 2018.01.17 |