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










Posted by 너래쟁이
: