16
16
import javafx .scene .control .Alert ;
17
17
import javafx .scene .control .ButtonType ;
18
18
import javafx .scene .control .Label ;
19
+ import javafx .scene .layout .AnchorPane ;
19
20
import javafx .scene .layout .BorderPane ;
20
21
import javafx .scene .layout .HBox ;
21
22
import javafx .scene .layout .StackPane ;
@@ -49,12 +50,10 @@ enum Mode {
49
50
@ FXML // URL location of the FXML file that was given to the FXMLLoader
50
51
private URL location ;
51
52
52
- @ FXML
53
- private StackPane stackPane ; // Value injected by FXMLLoader
54
-
55
-
56
53
@ FXML // fx:id="rootPane"
57
54
private BorderPane rootPane ; // Value injected by FXMLLoader
55
+ @ FXML // fx:id="rootPane"
56
+ private StackPane stackPane ; // Value injected by FXMLLoader
58
57
private FileChooser fileChooser ;
59
58
60
59
@ FXML
@@ -71,6 +70,12 @@ void about(ActionEvent event) {
71
70
72
71
@ FXML
73
72
void close (ActionEvent event ) {
73
+ MediaPlayerInterface p = player .get ();
74
+ if (p != null ) {
75
+ p .dispose ();
76
+ player .set (null );
77
+ stackPane .getChildren ().clear ();
78
+ }
74
79
getStage ().close ();
75
80
}
76
81
@@ -87,6 +92,51 @@ private Stage getStage() {
87
92
return scene == null ? null : (Stage ) scene .getWindow ();
88
93
}
89
94
95
+ @ FXML
96
+ void zoomIn (ActionEvent event ) {
97
+ zoomTo ((Math .round (getZoomPower () + 1 )));
98
+ }
99
+
100
+ @ FXML
101
+ void zoomOut (ActionEvent event ) {
102
+ zoomTo ((Math .round (getZoomPower () - 1 )));
103
+ }
104
+
105
+ @ FXML
106
+ void zoomToActualSize (ActionEvent event ) {
107
+ zoomTo (0 );
108
+ }
109
+
110
+ void zoomTo (double power ) {
111
+ MediaInterface media = getPlayer () instanceof MediaPlayerInterface p ? p .getMedia () : null ;
112
+ if (media == null ) {
113
+ return ;
114
+ }
115
+ double factor = Math .pow (2 , power );
116
+ stackPane .setPrefWidth (media .getWidth () * factor );
117
+ stackPane .setPrefHeight (media .getHeight () * factor );
118
+ getStage ().sizeToScene ();
119
+ }
120
+
121
+ private MediaPlayerInterface getPlayer () {
122
+ return player .get ();
123
+ }
124
+
125
+ private double getZoomPower () {
126
+ MediaInterface media = getPlayer () instanceof MediaPlayerInterface p ? p .getMedia () : null ;
127
+ if (media == null ) {
128
+ return 1 ;
129
+ }
130
+ double factor = stackPane .getWidth () / media .getWidth ();
131
+ double power = Math .log (factor ) / Math .log (2 );
132
+ return power ;
133
+ }
134
+
135
+ @ FXML
136
+ void zoomToFit (ActionEvent event ) {
137
+ zoomTo (getZoomPower ());
138
+ }
139
+
90
140
@ FXML
91
141
// This method is called by the FXMLLoader when initialization is complete
92
142
void initialize () {
@@ -148,21 +198,23 @@ private void createMoviePlayer(int retries) {
148
198
};
149
199
150
200
if (player == null || player .getError () != null ) {
151
- retryCreateMoviePlayer (retries );
201
+ retryCreateMoviePlayer (retries , player == null ? null : player . getError () );
152
202
} else {
153
- player .setOnError (() -> retryCreateMoviePlayer (retries ));
203
+ this .player .set (player );
204
+ player .setOnError (() -> retryCreateMoviePlayer (retries , player .getError ()));
154
205
}
155
206
}
156
207
157
- private void retryCreateMoviePlayer (int retries ) {
208
+ private void retryCreateMoviePlayer (int retries , Throwable error ) {
158
209
Mode [] values = Mode .values ();
159
210
if (retries < values .length ) {
160
211
mode .set (values [(mode .get ().ordinal () + 1 ) % values .length ]);
161
212
createMoviePlayer (retries + 1 );
162
213
} else {
163
214
ObservableList <Node > c = stackPane .getChildren ();
164
215
c .clear ();
165
- c .add (new Label (resources .getString ("error.creatingPlayer" )));
216
+ c .add (new Label (resources .getString ("error.creatingPlayer" ) + "\n " + error ));
217
+ error .printStackTrace ();
166
218
}
167
219
}
168
220
@@ -174,9 +226,9 @@ private MediaPlayerInterface createMonteMediaPlayer() {
174
226
}
175
227
MonteMedia movie = new MonteMedia (mediaFile );
176
228
MonteMediaPlayer player = new MonteMediaPlayer (movie );
177
- MonteMediaView monteMediaView = MonteMediaView .newVideoView ();
229
+ MonteMediaView monteMediaView = MonteMediaView .newMonteMediaView ();
178
230
monteMediaView .setMedia (movie );
179
- ControlsController playerController = createPlayerController ();
231
+ PlayerControlsController playerController = createPlayerController ();
180
232
playerController .setPlayer (player );
181
233
showPlayer (monteMediaView .getRoot (), player , movie , playerController );
182
234
return player ;
@@ -201,15 +253,22 @@ private MediaPlayerInterface createFXMoviePlayer() {
201
253
mediaPlayer .dispose ();
202
254
return null ;
203
255
}
204
- ControlsController playerController = createPlayerController ();
256
+ PlayerControlsController playerController = createPlayerController ();
205
257
FXMediaPlayer p = new FXMediaPlayer (mediaPlayer );
206
258
player .set (p );
207
259
playerController .setPlayer (p );
208
260
mediaPlayer .setAutoPlay (true );
209
261
mediaView = new MediaView (mediaPlayer );
210
262
263
+
264
+ mediaView .fitWidthProperty ().bind (stackPane .widthProperty ());
265
+ mediaView .fitHeightProperty ().bind (stackPane .heightProperty ());
266
+ mediaView .setManaged (false );
267
+
268
+ mediaView .setPreserveRatio (false );
269
+
270
+
211
271
showPlayer (mediaView , p , new FXMedia (media ), playerController );
212
- //mediaView.setOnError(t -> leftStatusLabel.setText(resources.getString("error") + t.toString()));
213
272
214
273
return p ;
215
274
} catch (Exception mediaException ) {
@@ -218,19 +277,21 @@ private MediaPlayerInterface createFXMoviePlayer() {
218
277
return null ;
219
278
}
220
279
221
-
222
- private void showPlayer (Node mediaView , MediaPlayerInterface mediaPlayer , MediaInterface media , ControlsController playerController ) {
280
+ private void showPlayer (Node mediaView , MediaPlayerInterface mediaPlayer , MediaInterface media , PlayerControlsController playerController ) {
223
281
mediaPlayer .setOnReady (() -> {
282
+ stackPane .setPrefWidth (media .getWidth ());
283
+ stackPane .setPrefHeight (media .getHeight ());
224
284
sizeStageToScene ();
225
285
});
226
286
227
287
stackPane .getChildren ().addAll (mediaView , playerController .getRoot ());
228
288
}
229
289
230
- private ControlsController createPlayerController () {
290
+ private PlayerControlsController createPlayerController () {
231
291
try {
232
- FXMLLoader loader = new FXMLLoader (getClass ().getResource ("Controls .fxml" ));
292
+ FXMLLoader loader = new FXMLLoader (getClass ().getResource ("PlayerControls .fxml" ));
233
293
ResourceBundle labels = ResourceBundle .getBundle ("org.monte.demo.javafx.movieplayer.Labels" );
294
+ loader .setRoot (new AnchorPane ());
234
295
loader .setResources (labels );
235
296
loader .load ();
236
297
return loader .getController ();
0 commit comments