Форум программистов, компьютерный форум, киберфорум
JavaFX
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/37: Рейтинг темы: голосов - 37, средняя оценка - 4.73
3 / 3 / 0
Регистрация: 05.06.2013
Сообщений: 16
1

Работа с MediaPlayer в JavaFX

17.07.2013, 18:57. Показов 7389. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
создаю первый в своей жизни медиаплеер с использованием JavaFX? столкнулся с проблемой утечки потоков. при выполнении кода:

Java
1
MediaPlayer mediaplayer = new MediaPlayer(mediafile);
создаются 2 потока:
первый - JFXMedia Player EventQueueThread
второй - просто имеет порядковый номер (Thread-2).
после окончания воспроизведения первого файла оба потока остаются живыми.
При переходе к воспроизведению следующего файла из плэйлиста, создаются еще 2 потока и т.д.
Как остановить ненужные больше потоки?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.07.2013, 18:57
Ответы с готовыми решениями:

Работа с JavaFX и ее потоком
Мне нужно сделать, чтобы показывался Stage, но этого нельзя сделать, потому что работать с javafx...

Работа с элементами JavaFX
Доброго времени суток. Вопрос такой. Набросал форму в Scene Builder. Подключил ее в проект. На...

JavaFX. Самое первое задание в JavaFX вместо Java. Не используя вспомогательных объектов
Всем привет, уважаемые форумчане! Мы работали на программировании в вузе на Java. Теперь дали...

Swing --> JavaFX, Переписать графический компонент в JavaFX
Всем привет! Только начал изучать Java. Пишу программу крестики-нолики(игра). Написал...

20
1 / 1 / 0
Регистрация: 12.06.2013
Сообщений: 18
22.07.2013, 13:04 2
Цепляеш на любое условие(на закрытие окна например)

thread_name.stop();
0
3 / 3 / 0
Регистрация: 05.06.2013
Сообщений: 16
22.07.2013, 13:06  [ТС] 3
так не работает, причем второй поток который создается с произвольным именем, я так не поймаю, ведь я не знаю кокой номер ему присвоится в следующий раз
0
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
22.07.2013, 13:28 4
Цитата Сообщение от ill_via Посмотреть сообщение
Как остановить ненужные больше потоки?
может не останавливать ненужные, а просто переиспользовать, у вас же параллельно 2 воспроизведения не требуются надеюсь )
0
3 / 3 / 0
Регистрация: 05.06.2013
Сообщений: 16
22.07.2013, 17:47  [ТС] 5
мне праллельное воспроизведение не нужно, просто у mediaplayer нет метода, который бы мог заменить закончившийся медиафайл на следующий, и поэтому приходится каждый раз создавать новый экземпляр плеера, что в свою очередь приводит к созданию лишних потоков., еслибы я знал как можно по новой использовать уже имеющийся объект, прооблема бы решилась. если кто знает напишите пожалуйста.

Добавлено через 1 час 16 минут
Цитата Сообщение от Ger@lt Посмотреть сообщение
Цепляеш на любое условие(на закрытие окна например)

thread_name.stop();
так не работает, причем второй поток который создается с произвольным именем, я так не поймаю, ведь я не знаю кокой номер ему присвоится в следующий раз

Добавлено через 2 часа 3 минуты
Цитата Сообщение от mutagen Посмотреть сообщение
может не останавливать ненужные, а просто переиспользовать, у вас же параллельно 2 воспроизведения не требуются надеюсь )
мне праллельное воспроизведение не нужно, просто у mediaplayer нет метода, который бы мог заменить закончившийся медиафайл на следующий, и поэтому приходится каждый раз создавать новый экземпляр плеера, что в свою очередь приводит к созданию лишних потоков., еслибы я знал как можно по новой использовать уже имеющийся объект, прооблема бы решилась. если кто знает напишите пожалуйста.
0
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
22.07.2013, 17:56 6
а в конце воспроизведения попробуйте медиа плееру присваивать null явно, возможно у вас утечка идёт гдето и gc не собирает
0
3 / 3 / 0
Регистрация: 05.06.2013
Сообщений: 16
22.07.2013, 18:28  [ТС] 7
Цитата Сообщение от mutagen Посмотреть сообщение
а в конце воспроизведения попробуйте медиа плееру присваивать null явно, возможно у вас утечка идёт гдето и gc не собирает
я так и делаю, перед созданием нового плеера, старый в null загоняю, но это не помогает. если кто-нибудь сможет помочь и посмотреть код, тогда я кину его
0
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
22.07.2013, 23:45 8
кидай код, я его погоняю под отладчиком, мож чё найду
0
3 / 3 / 0
Регистрация: 05.06.2013
Сообщений: 16
23.07.2013, 08:53  [ТС] 9
Главный класс
Java
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
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package project;
 
import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.stage.Stage;
import javafx.util.Duration;
import java.util.*;
import javax.swing.JFrame;
 
/**
 *
 * @author ill
 */
 
public class Project extends Application implements EventListener {
 
    Media mediafile = null;
    MediaPlayer mediaplayer = null;
    List<Media> arrMedia = new ArrayList<>();
    Duration CurrentTime;
    Duration TotalTime;
    JFrame PlayList = new JFrame("плейлист");
    Thread tp = new Thread();
    int tplayer = 0;
    
    
    @Override
    public void start(Stage primaryStage) {        
        View v  = new View();
        primaryStage.setTitle("JavaFX player");
        primaryStage.setScene(v.createView());
        primaryStage.setX(380);
        primaryStage.setY(380);
        primaryStage.show();
    }
    
    /**
     * The main() method is ignored in correctly deployed JavaFX application.
     * main() serves only as fallback in case the application can not be
     * launched through deployment artifacts, e.g., in IDEs with limited FX
     * support. NetBeans ignores main().
     *
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);        
    }
}
Класс плеера(плей лист еще некорректно работает, не успел доделать)

Java
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package project;
 
import java.io.File;
 
import java.util.List;
import java.util.Random;
import javafx.collections.MapChangeListener;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.stage.FileChooser;
import javafx.util.Duration;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ScrollPaneConstants;
 
/**
 *
 * @author ill
 */
public abstract class Player extends Project {
 
    /**
     * метод открытия звуковых файлов
     *
     * @return mediafile
     */
    public Media OpenMedia() {
        FileChooser fileChooser = new FileChooser();
        fileChooser.setTitle("открытие звукового файла");
        fileChooser.getExtensionFilters().addAll(
                new FileChooser.ExtensionFilter("Audio Files", " *.wav", "*.mp3", " *.wma", " *.aac"));
        List<File> arrFile = fileChooser.showOpenMultipleDialog(null);
        if (arrFile != null) {
            for (int i = 0; i < arrFile.size(); i++) {
                File file = arrFile.get(i);
                mediafile = new Media(file.toURI().toString());
                addArray();
            }
            mediafile = arrMedia.get(0);
            return mediafile;
        } else {
            return null;
        }
    }
 
    /**
     * метод воспроизведения звукового файла
     */
    public void StartPlay() {
        if (mediaplayer != null) {
            if (mediaplayer.getStatus() == MediaPlayer.Status.PAUSED) {
                mediaplayer.setStartTime(CurrentTime);
                mediaplayer.play();
            }
            if (mediaplayer.getStatus() == MediaPlayer.Status.STOPPED) {
                mediaplayer.stop();
                mediaplayer.setStartTime(Duration.ZERO);
                mediaplayer.play();
            }
        } else {
            while (mediafile == null) {
                OpenMedia();
            }
            mediaplayer = new MediaPlayer(mediafile);
            mediaplayer.play();
            this.setEvents();
        }
        System.out.println(mediaplayer.getStatus() + " " + CurrentTime + " " + Thread.currentThread().getName() + " play");
    }
 
    abstract protected void setEvents();
 
    /**
     * метод паузы воспроизведения
     */
    public void PausePlayer() {
        if (mediaplayer != null) {
            mediaplayer.pause();
            System.out.println(mediaplayer.getStatus() + " " + CurrentTime + " " + Thread.currentThread().getName() + " pause");
        }
    }
 
    /**
     * метод открытия плей листа
     */
    public void OpenPlayList() {
        if (!PlayList.isVisible()) {
            PlayList.setBounds(380, 520, 250, 300);
            int v = ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED;
            int h = ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED;            
            JScrollPane jsp = new JScrollPane(table, v, h);          
            PlayList.add(jsp);
            PlayList.setVisible(true);
        } else {
            PlayList.setVisible(false);
            PlayList.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        }
    }
    
    JTable table;
    TableModel tm = new TableModel(arrMedia);
 
    /**
     * метод остановки плеера
     */
    public void StopPlay() {
        if (mediaplayer != null) {
            CurrentTime = Duration.ZERO;
            mediaplayer.setStartTime(Duration.ZERO);
            mediaplayer.stop();
            System.out.println(mediaplayer.getStatus() + " " + CurrentTime + " " + Thread.currentThread().getName() + " stop");
        }
    }
 
    /**
     * метод преобразования Duration в минуты и секунды
     *
     * @return строку
     */
    public String Format(Duration d) {
        final int seconds = (int) (d.toMillis() / 1000) % 60;
        final int minutes = (int) (d.toMillis() / (1000 * 60));
        return String.format("%02d:%02d", minutes, seconds);
    }
    
    String mediatitle;
    String artist = null;
    String title = null;
    String dur = null;
 
    /**
     * метод добавления медиа файлов в коллекцию
     *
     */
    public void addArray() {
        arrMedia.add(mediafile);
        tm.setValueAt(mediafile);
        table = new JTable(tm);
        mediafile.getMetadata().addListener(new MapChangeListener<String, Object>() {
            @Override
            public void onChanged(MapChangeListener.Change<? extends String, ? extends Object> ch) {
                if (ch.wasAdded()) {
                    handleMetadata(ch.getKey(), ch.getValueAdded());
                }
            }
        });
    }
    
    int currFileIndex = 0;
 
    /**
     * метод выбора следующей композиции
     */
    public Boolean NextMedia(Boolean isRepeat, boolean isRandom) {
 
//        Thread th = Thread.currentThread();
//        ThreadGroup tg = th.getThreadGroup();
//        Thread active[] = new Thread[tg.activeCount() + 1];
//        int count = tg.enumerate(active);
//        for (int i = 0; i < count; i++) {
//            System.out.println("===" + active[i].getName());
//            if (active[i].getName().equals("JFXMedia Player EventQueueThread")) {
//                active[i].interrupt();
//                System.out.println("===" + active[i].getName());
//            }
//        }
        currFileIndex++;
        if (currFileIndex <= arrMedia.size() - 1) {
            if (isRandom) {
                Random r = new Random();
                mediafile = arrMedia.get(r.nextInt(arrMedia.size()));
                return true;
            } else {
                mediafile = arrMedia.get(currFileIndex);                
                return true;
            }
        } else {
            if (isRepeat) {
                if (isRandom) {
                    Random r = new Random();
                    mediafile = arrMedia.get(r.nextInt(arrMedia.size()));
                    System.out.println(mediafile.getMetadata().get("title"));
                    return true;
                }
                else {
                    currFileIndex = 0;
                    mediafile = arrMedia.get(0);                    
                    return true;
                }
            }
        }
        return false;
    }
 
    /**
     * метод выбора предыдущей композиции
     */
    public void BackMedia(Boolean isRepeat) {
 
        currFileIndex--;
        if (currFileIndex <= arrMedia.size() - 1) {
            mediafile = arrMedia.get(currFileIndex);
        } else {
            if (isRepeat) {
                currFileIndex = 0;
                mediafile = arrMedia.get(0);
            }
        }
    }
 
    /**
     *  обработка метаданных медиафайла
     * @param key
     * @param value 
     */
    private void handleMetadata(String key, Object value) {
 
        if (key.equals("artist")) {
            artist = value.toString();
        }
        if (key.equals("title")) {
            title = value.toString();
        }
        if (key.equals("duration")) {
            dur = Format((Duration) value);
        }
    }
 
    /**
     * метод отображения в окне названия композиции
     * @return строку
     */
    public String GetMediaName() {
 
        String m;
        if (mediafile.getMetadata().get("artist") != null && mediafile.getMetadata().get("title") != null) {
            m = mediafile.getMetadata().get("artist") + " - " + mediafile.getMetadata().get("title");
        } else {
            int lastIndexOf = mediafile.getSource().lastIndexOf("/");
            m = mediafile.getSource().substring(lastIndexOf + 1);
            m = m.replace("%", " ");
        }
        return m;
    }
}
Класс для отображения окна и контролов
Java
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package project;
 
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.Label;
import javafx.scene.control.Slider;
import javafx.scene.control.Tooltip;
import javafx.scene.effect.Blend;
import javafx.scene.effect.BlendMode;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.media.MediaPlayer;
import javafx.util.Duration;
 
/**
 *
 * @author ill
 */
public class View extends Player {
 
    final Label totalDuration = new Label("00:00");
    final Label currentTime = new Label("00:00");
    final Label mediaName = new Label(" ");
    final Slider positionSlider = new Slider(0.0, 1.0, 0.1);
    final CheckBox repeat = new CheckBox("rep");
    final CheckBox random = new CheckBox("ran");
    private Boolean isRewinded = false;
    private Boolean isEndMedia = false;
    private Boolean isTotal = true;    
 
    public Scene createView() {
        /**
         * Разметка окна кнопок воспроизведения
         */
        GridPane grid = new GridPane();
        grid.setAlignment(Pos.CENTER);
        grid.setHgap(10);
        grid.setVgap(10);
        grid.setPadding(new Insets(5, 5, 5, 5));
        grid.setGridLinesVisible(false);
 
        /**
         * описание кнопки предыдущий трек
         */
        Button back = new Button("back");
        back.setMinSize(50, 25);
        HBox hbback = new HBox(10);
        hbback.setAlignment(Pos.CENTER);
        repeat.setTooltip(new Tooltip("пердыдущий файл"));
        back.setEffect(new Blend(BlendMode.MULTIPLY));
        hbback.getChildren().add(back);
 
        /**
         * описание кнопки play
         */
        final Button play = new Button("play");
        play.setMinSize(50, 25);
        HBox hbplay = new HBox(10);
        play.setTooltip(new Tooltip("воспроизведение"));
        hbplay.setAlignment(Pos.CENTER);
        hbplay.getChildren().add(play);
 
        /**
         * описание кнопки pause
         */
        Button pause = new Button("pause");
        pause.setMinSize(50, 25);
        HBox hbpause = new HBox(10);
        pause.setTooltip(new Tooltip("пауза"));
        hbpause.setAlignment(Pos.CENTER);
        hbpause.getChildren().add(pause);
 
        /**
         * описание кнопки следующий трек
         */
        Button next = new Button("next");
        next.setMinSize(50, 25);
        HBox hbnext = new HBox(10);
        next.setTooltip(new Tooltip("следующий файл"));
        hbnext.setAlignment(Pos.CENTER);
        hbnext.getChildren().add(next);
 
        /**
         * описание кнопки следующий трек
         */
        Button stop = new Button("stop");
        stop.setMinSize(50, 25);
        HBox hbstop = new HBox(10);
        stop.setTooltip(new Tooltip("остановка"));
        hbstop.setAlignment(Pos.CENTER);
        hbstop.getChildren().add(stop);
 
        /**
         * описание кнопки следующий трек
         */
        Button open = new Button("open");
        open.setMinSize(50, 25);
        HBox hbopen = new HBox(10);
        open.setTooltip(new Tooltip("открытие файла"));
        hbopen.setAlignment(Pos.CENTER);
        hbopen.getChildren().add(open);
 
        /**
         * слайдер позиции воспроизведения
         */
        positionSlider.setId("positionSlider");
        positionSlider.setValue(0);
 
        /**
         * слайдер регулировки громкости воспроизведения
         */
        final Slider volumeSlider = new Slider(0.0, 1.0, 0.1);
        volumeSlider.setId("volumeSlider");
        HBox hbvsl = new HBox(10);
        volumeSlider.setLayoutX(50.0);
        volumeSlider.setValue(1.0);
        hbvsl.setAlignment(Pos.TOP_CENTER);
        hbvsl.getChildren().add(volumeSlider);
        
        /**
         * описание метки полная длительность файла 
         */
        totalDuration.setAlignment(Pos.CENTER_LEFT);
        totalDuration.setPrefSize(100, 75);
        HBox hblbt = new HBox(10);
        hblbt.setAlignment(Pos.CENTER_LEFT);
        hblbt.getChildren().add(totalDuration);
 
        /**
         * описание метки громкость
         */
        Label volume = new Label("громкость");
        volume.setAlignment(Pos.BOTTOM_CENTER);
        volume.setPrefSize(100, 25);
        HBox hblbv = new HBox(10);
        hblbv.setAlignment(Pos.BOTTOM_CENTER);
        hblbv.getChildren().add(volume);
 
        /**
         * описание метки текущее время воспроизведения файла
         */
        currentTime.setAlignment(Pos.CENTER_RIGHT);
        currentTime.setPrefSize(100, 75);
        HBox hblbc = new HBox(10);
        hblbc.setAlignment(Pos.CENTER_RIGHT);
        hblbc.getChildren().add(currentTime);
        
        /**
         * описание метки имя медиафайла
         */
        mediaName.setAlignment(Pos.TOP_LEFT);
        mediaName.setPrefSize(150, 25);
        HBox hblbn = new HBox(10);
        hblbn.setAlignment(Pos.TOP_LEFT);
        hblbn.getChildren().add(mediaName);
 
        /**
         * описание кнопки плей-лист
         */
        Button playlist = new Button("playlist");
        playlist.setAlignment(Pos.CENTER_LEFT);
        playlist.setMinSize(50, 25);
        HBox hbplaylist = new HBox(10);
        playlist.setTooltip(new Tooltip("открыть плейлист"));
        hbplaylist.setAlignment(Pos.CENTER_LEFT);
        hbplaylist.getChildren().add(playlist);
 
        /**
         * описание чекбокса на повтор
         */
        HBox hbrepeat = new HBox(10);
        hbrepeat.setAlignment(Pos.TOP_CENTER);
        repeat.setTooltip(new Tooltip("повтор плейлиста"));
        hbrepeat.getChildren().add(repeat);
 
        /**
         * описание чекбокса на случайное воспроизведение
         */
        HBox hbrandom = new HBox(10);
        hbrandom.setAlignment(Pos.TOP_CENTER);
        repeat.setTooltip(new Tooltip("случайное воспроизведение"));
        hbrandom.getChildren().add(random);
        
        /**
         * добавление контролов на сетку
         */
        grid.add(hbback, 1, 1,1,2);
        grid.add(hbplay, 3, 1,1,2);
        grid.add(hbpause, 4, 1,1,2);
        grid.add(hbnext, 5, 1,1,2);
        grid.add(hbstop, 2, 1,1,2);
        grid.add(hbopen, 6, 1,1,2);
        grid.add(hblbc, 0, 0,1,2);
        grid.add(hbplaylist, 0, 0);
        grid.add(hblbt, 6, 0);        
        grid.add(hblbv, 0, 1,1,2);
        grid.add(hbvsl, 0, 1,1,3);
        grid.add(hblbn, 1, 0, 5, 1);
        grid.add(hbrepeat, 4, 0);
        grid.add(hbrandom, 5, 0);
        grid.add(positionSlider, 1, 0, 5, 2);        
 
        /**
         * отображение окна
         */
        Scene scene = new Scene(grid, 500, 100);
 
        /**
         * вызов метода следующий трек
         */
        next.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent t) {
                isEndMedia = true;
                isTotal = true;
                while (tp.isAlive()) {
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException ex) {
                        Logger.getLogger(View.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    System.out.println("убей поток  " + mediafile.getSource());
                }
                CurrentTime = Duration.ZERO;
                currentTime.setText(String.format("%02d:%02d", 0, 0));
                positionSlider.setValue(0);
                StopPlay();
                mediaplayer = null;
                NextMedia(true, random.selectedProperty().getValue());
                isEndMedia = false;
                StartPlay();
            }
        });
        
        /**
         * вызов метода предыдущий трек
         */
        back.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent t) {
                isEndMedia = true;
                isTotal = true;
                while (tp.isAlive()) {
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException ex) {
                        Logger.getLogger(View.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    System.out.println("убей поток  " + mediafile.getSource());
                }
                CurrentTime = Duration.ZERO;
                currentTime.setText(String.format("%02d:%02d", 0, 0));
                positionSlider.setValue(0);
                StopPlay();
                mediaplayer = null;
                BackMedia(true);
                isEndMedia = false;
                StartPlay();
            }
        });
        
        /**
         * вызов метода воспроизведения
         */
        play.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                StartPlay();                
                mediaplayer.setVolume(volumeSlider.getValue());
                volumeSlider.valueProperty().bindBidirectional(mediaplayer.volumeProperty());
                isRewinded = false;
            }
        });
 
        /**
         * перемотка трека слайдером
         */
        positionSlider.setOnMouseClicked(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent t) {
                if (mediaplayer!=null) {
                    isRewinded = true;
                    System.out.println("starttime=" + TotalTime.multiply(positionSlider.getValue()).toMillis());                    
                    mediaplayer.seek(TotalTime.multiply(positionSlider.getValue()));
                    isRewinded = false;
                }
            }
        });
 
        /**
         * вызов метода кнопки пауза
         */
        pause.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                if (mediaplayer != null) {
                    CurrentTime = mediaplayer.getCurrentTime();
                    isRewinded = true;
                } else {
                    CurrentTime = Duration.ZERO;
                }
                PausePlayer();
            }
        });
 
        /**
         * вызов метода открытия файла
         */
        open.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                OpenMedia();
            }
        });
 
        /**
         * вызов метода кнопки стоп
         */
        stop.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                StopPlay();
                currentTime.setText(String.format("%02d:%02d", 0, 0));
                positionSlider.setValue(0);
                isRewinded = true;
            }
        });
 
        /**
         * вызов метода открытия плей листа
         */
        playlist.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                OpenPlayList();
            }
        });
 
        return scene;
    }
 
    /**
     * отображение слайдером и меткой текущего времени воспроизведения
     * по окончании файла вызывается следующий трек если он есть,
     * или начинается воспроизведени с начала плей листа, если стоит repeat
     */
    @Override
    protected void setEvents() {
        mediaplayer.setOnPlaying(new Runnable() {
            @Override
            public void run() {
                if (mediaplayer.getStatus() == MediaPlayer.Status.PLAYING) {
                    mediaName.setText(GetMediaName());
                    if (isTotal) {
                        TotalTime = mediaplayer.getTotalDuration();
                        totalDuration.setText(Format(mediaplayer.getTotalDuration()));                        
                        currentTime.setText(String.format("%02d:%02d", 0, 0));
                        isTotal = false;
                    }
                    if (!tp.isAlive()) {
                        tp = new Thread(new Runnable() {
                            @Override
                            public void run() {
                                while (mediaplayer != null && !isEndMedia) {
                                    if (isRewinded) {
                                        continue;
                                    }
                                    if (mediaplayer.getCurrentTime().toMillis() < TotalTime.toMillis()) {
 
                                        try {
                                            Thread.sleep(500);
                                        } catch (InterruptedException ex) {
                                            Logger.getLogger(View.class.getName()).log(Level.SEVERE, null, ex);
                                        }
                                        if (mediaplayer != null && mediaplayer.getTotalDuration() != null && mediaplayer.getCurrentTime() != null) {
                                            Platform.runLater(new Runnable() {
                                                @Override
                                                public void run() {
                                                    if (mediaplayer != null) {
                                                        currentTime.setText(Format(mediaplayer.getCurrentTime()));
                                                    } else {
                                                        currentTime.setText(String.format("%02d:%02d", 0, 0));
                                                    }
                                                }
                                            });
                                            positionSlider.setValue(mediaplayer.getCurrentTime().toMillis() / TotalTime.toMillis());
                                            //System.out.println(mediaplayer.getStatus() + " " + CurrentTime + " " + Thread.currentThread().getName() + " slider");
                                        } else {
                                            positionSlider.setValue(0);
                                        }
                                    }
                                }
                                isEndMedia = false;
                                Thread.currentThread().interrupt();
                            }
                        });
                    }
                    if (!tp.isAlive()) {
                        tp.setName("play");
                        tp.setDaemon(true);
                        tp.start();
                    }
                }
                System.out.println(mediaplayer.getStatus() + " " + CurrentTime + " " + Thread.currentThread().getName() + " playing");
            }
        });
        mediaplayer.setOnEndOfMedia(new Runnable() {
            @Override
            public void run() {
                tplayer++;
                isEndMedia = true;
                isTotal = true;
                while (tp.isAlive()) {
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException ex) {
                        Logger.getLogger(View.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    System.out.println("убей поток  " + mediafile.getSource());
                }
                CurrentTime = Duration.ZERO;
                currentTime.setText(String.format("%02d:%02d", 0, 0));
                positionSlider.setValue(0);
                StopPlay();
                mediaplayer = null;
                if (repeat.selectedProperty().getValue()) {
                    Boolean NextMedia = NextMedia(repeat.selectedProperty().getValue(), random.selectedProperty().getValue());
                    if (NextMedia) {
                        StartPlay();
                    } else {
                        CurrentTime = Duration.ZERO;
                        currentTime.setText(String.format("%02d:%02d", 0, 0));
                        positionSlider.setValue(0);
                        StopPlay();
                        mediaplayer = null;
                    }
                }
                System.out.println(CurrentTime + " " + Thread.currentThread().getName() + " endmedia");
                System.out.println(tplayer + " endmedia");
            }
        });
    }
}
Класс для tablemodel (заполнение плейлиста)
Java
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
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package project;
 
import java.util.*;
import java.util.Observable;
import java.util.Observer;
import javafx.scene.media.Media;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
 
/**
 *
 * @author nina
 */
public class TableModel extends AbstractTableModel implements Observer {
 
    private Set<TableModelListener> listeners = new HashSet<TableModelListener>();
    private static final String[] columnName = {"Название", "Вермя"};
    private static List<Media> arrMedia;
    private Media mediafile;
 
    public TableModel(List<Media> arrMedia) {
        super();
        this.arrMedia = arrMedia;  
    }
 
    @Override
    public void addTableModelListener(TableModelListener listener) {
        listeners.add(listener);
    }
 
    @Override
    public Class<?> getColumnClass(int columnIndex) {
        return String.class;
    }
 
    @Override
    public String getColumnName(int col) {
        return columnName[col];
    }
 
    @Override
    public void removeTableModelListener(TableModelListener listener) {
        listeners.remove(listener);
    }
 
    @Override
    public int getRowCount() {
        return arrMedia.size();
    }
 
    @Override
    public int getColumnCount() {
        return columnName.length;
    }
 
    public void setValueAt(Media newData){
        arrMedia.add(newData);
        fireTableDataChanged();
    }
    
    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        mediafile = arrMedia.get(rowIndex);
        String m = "";
        if (mediafile.getMetadata().get("artist")!=null && mediafile.getMetadata().get("title")!=null) {
            m = mediafile.getMetadata().get("artist") + " - " + mediafile.getMetadata().get("title");
        } else {
            int lastIndexOf = mediafile.getSource().lastIndexOf("/");
            m = mediafile.getSource().substring(lastIndexOf+1);
            m = m.replace("%", " ");
        }
        System.out.println(m);
        switch (columnIndex) {
            case 0:               
                return m;
            case 1:
                return null;
        }
        return null;
    }
 
    @Override
    public void update(Observable o, Object arg) {
        int index = arrMedia.indexOf(o);
        fireTableRowsUpdated(index, index);
    }
    
}
0
3 / 3 / 0
Регистрация: 05.06.2013
Сообщений: 16
23.07.2013, 09:06  [ТС] 10
вот вся папка с проектом
Вложения
Тип файла: zip Project.zip (512.5 Кб, 52 просмотров)
0
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
23.07.2013, 23:56 11
протестировал, всё ок, потоки висят в кеше примерно по 3-4 штуки если наплодить 20-30 и потом вызвать GC они опять снижаются до 3-4 поэтому нет проблем, просто зануляйте медиа и плер по стопу
0
3 / 3 / 0
Регистрация: 05.06.2013
Сообщений: 16
24.07.2013, 07:27  [ТС] 12
Цитата Сообщение от mutagen Посмотреть сообщение
если наплодить 20-30 и потом вызвать GC они опять снижаются до 3-4
у меня доходило до 60 потоков ( и простите меня за безграмотность, а что такое GC, я просто только начинаю изучение и многих сокращений еще не знаю.
0
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
24.07.2013, 09:31 13
Цитата Сообщение от ill_via Посмотреть сообщение
GC
это гарбаж коллектор )
я вызывал его явно, но вам этого делать не надо так как JVM сама решит когда ей пора почистить дохлые объекты
1
3 / 3 / 0
Регистрация: 05.06.2013
Сообщений: 16
24.07.2013, 11:16  [ТС] 14
спасибо огромное, я уже плей лист доделал, теперь все нормально отображается, теперь бы еще разобраться как длительность файла узнать до его воспроизведения(в момент добавления в коллекцию), вообще красота была бы )), а то далеко не все файлы содержат в метаданных эту информацию

Добавлено через 51 минуту
Цитата Сообщение от mutagen Посмотреть сообщение
но вам этого делать не надо так как JVM сама решит когда ей пора почистить дохлые объекты
похоже прийдется, у меня сейчас висит 40 левых потоков и оперативку они хавают прилично, при создании нового потока каждый раз память потребляемая приложением +3-4МБ, таким образом никакой оперативки не хватит (если стоит плейлист на 500 песен да еще и repeat включить или просто нажимать следующий или предыдущий трек) (((, расскажите как принудительно вызвать GC.
0
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
24.07.2013, 12:17 15
если при запуске JVM нет ключей вырубающих ручной gc, то всё прогсто

Java
1
System.gc();
хочу вас сразу предупредить, что это считается плохим стилем, так как вы мешаете JVM работать и оптимизировать себя, всякие там JIT и тд
0
3 / 3 / 0
Регистрация: 05.06.2013
Сообщений: 16
24.07.2013, 15:04  [ТС] 16
попробовал запускать GC но воз и ныне там, потоки плодятся и не убиваются ((( есть еще идеи, как остановить вакханалию с потоками? (для сравнени kmplayer при воспроизведении тогоже объема медиа жрет всего 12 МБ оперативки, а мое чудо на 10 песне уже 120 МБ оперативки)
0
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
24.07.2013, 18:37 17
я вам уже всё что нужно сообщил, зануляйте переменные и не лазьте в gc, JVM разберётся с памятью

по stop вызывается destroy этих потоков, они умирают если на них нет ссылок, ищите где у вас виснут ссылки
0
3 / 3 / 0
Регистрация: 05.06.2013
Сообщений: 16
28.07.2013, 19:58  [ТС] 18
Господа, подскажите как поставить свою иконку на окно созданое в JavaFX(иконка которая возле title висит)
0
любитель покушать
687 / 641 / 248
Регистрация: 25.09.2011
Сообщений: 1,313
28.07.2013, 20:57 19
ill_via,
Java
1
stage.getIcons().add(new Image("http://*******/sLKiSM"));
1
3 / 3 / 0
Регистрация: 05.06.2013
Сообщений: 16
28.07.2013, 21:27  [ТС] 20
спасибо большое!!!
0
28.07.2013, 21:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.07.2013, 21:27
Помогаю со студенческими работами здесь

JavaFX - Работа с JDBC + GUI + Table. Данные в таблице не отображаются
Всем доброго времени суток, с Java и JavaFX я только учусь работать, поэтому возникла такая...

Отобразить javafx.scene.image.Image в javafx.scene.layout.GridPane
Подскажите, пожалуйста, как отобразить javafx.scene.image.Image в javafx.scene.layout.GridPane.

Работа с mediaplayer
Здравствуйте возникла проблема. Я делаю программу плеер что то вроде винампа и у меня возникла...

Работа с fragments и MediaPlayer
Здравствуйте! Возник такой вопрос. Я организовал кнопку, при нажатии которой вызывается фрагмент и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru