一、課程設計目的
1、編程設計音樂播放軟件,使之實現音樂播放的功能。
2、培養學生用程序解決實際問題的能力和興趣。
3、加深java中對多媒體編程的應用。
二、課程設計的要求
利用學到的編程知識和編程技巧,要求學生:
1、系統設計要能完成題目所要求的功能,設計的軟件可以進行簡單的播放及其他基本功能。
2、編程簡練,可用,盡可能的使系統的功能更加完善和全面
3、說明書、流程圖要清楚。
三、課程設計內容
1、課程設計的題目及簡介
音樂播放軟件要求:
有圖形界面,能播放MP3歌曲,有播放列表,前一首、后一首等常用播放軟件功能。
2、設計說明
主要運用多媒體編程、圖形界面、數組及循環進行設計,從而實現簡單的音樂播放。
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
|
package com.mainyin; import javax.media.ControllerEvent; import javax.media.ControllerListener; import javax.media.EndOfMediaEvent; import javax.media.PrefetchCompleteEvent; import javax.media.RealizeCompleteEvent; import javax.media.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class MediaPlayer extends JFrame implements ActionListener, ItemListener, ControllerListener { String title; Player player; boolean first = true , loop = false ; Component vc, cc; String currentDirectory= null ; // 構造函數,其中包括了設置響應窗口事件的監聽器。 MediaPlayer(String title) { super (title); /* 關閉按鈕的實現。。 */ addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { dispose(); } public void windowClosed(WindowEvent e) { if (player != null) player.close(); System.exit(0); } }); // 調用程序菜單欄的方法成員完成菜單的布置 setupMenu(); setSize(400, 400); setVisible(true); } // 本方法用以設置程序菜單欄 public void setupMenu() { // 設置一個菜單 Menu f = new Menu("文件"); // 往設置的菜單添加菜單項 MenuItem mi = new MenuItem("打開"); f.add(mi); mi.addActionListener(this); f.addSeparator(); CheckboxMenuItem cbmi = new CheckboxMenuItem("循環", false); cbmi.addActionListener(this); f.add(cbmi); f.addSeparator(); MenuItem ee = new MenuItem("退出"); ee.addActionListener(this); f.add(ee); f.addSeparator(); Menu l = new Menu("播放列表"); Menu c = new Menu("播放控制"); MenuItem move = new MenuItem("播放"); move.addActionListener(this); c.add(move); c.addSeparator(); MenuItem pause = new MenuItem("暫停"); pause.addActionListener(this); c.add(pause); c.addSeparator(); MenuItem stop = new MenuItem("停止"); stop.addActionListener(this); c.add(stop); c.addSeparator(); // 設置一個菜單欄 MenuBar mb = new MenuBar(); mb.add(f); mb.add(c); mb.add(l); // 將構造完成的菜單欄交給當前程序的窗口; setMenuBar(mb); } // 動作時間響應成員;捕捉發送到本對象的各種事件; public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub String cufile, selectfile, currentDirectory; if (e.getActionCommand().equals("退出")) { // 調用dispose以便執行windowClosed dispose(); return; } // 此事表明擁護選擇了“播放”命令; // 如果當前有一個文件可以播放則執行播放命令; if (e.getActionCommand().equals("播放")) { if (player != null) { player.start(); } return; } // 如果當前正在播放某一文件,則執行暫停; if (e.getActionCommand().equals("暫停")) { if (player != null) { player.stop(); } return; } // 停止命令的響應; if (e.getActionCommand().equals("停止")) { if (player != null) { player.stop(); player.setMediaTime(new Time(0)); } return; } // 用戶選擇要播放的媒體文件 if (e.getActionCommand().equals("打開")) { FileDialog fd = new FileDialog(this, "打開媒體文件", FileDialog.LOAD); // fd.setDirectory(currentDirectory); fd.setVisible(true); // 如果用戶放棄選擇文件,則返回 if (fd.getFile() == null) { return; } // 保存了所選文件的名稱及其路徑名稱已被稍后使用 // 同時設置當前文件夾路徑 selectfile = fd.getFile(); currentDirectory = fd.getDirectory(); cufile = currentDirectory + selectfile; // 將用戶選擇的文件作為一個菜單項加入播放列表,該菜單項名為該文件名; // 被點擊后給出的命令串是該文件的全路徑名 MenuItem mi = new MenuItem(selectfile); mi.setActionCommand(cufile); MenuBar mb = getMenuBar(); Menu m = mb.getMenu(2); mi.addActionListener(this); m.add(mi); } else { // 程序邏輯運行到次表示用戶選擇了一個“播放列表”中的媒體文件 // 此時可以通過如下動作獲得該文件的全路徑名 cufile = e.getActionCommand(); selectfile = cufile; } // 如果存在一個播放器,則先將其關閉,稍后再重新創建 // 創建播放器時需要捕捉一些異常 if (player != null) { player.close(); } try { player = Manager.createPlayer(new MediaLocator("file:" + cufile)); } catch (Exception e2) { System.out.println(e2); return; }/* * catch(NoPlayerException e2){ System.out.println("不能找到播放器"); * return ; } */ if (player == null) { System.out.println("無法創建播放器"); return; } first = false; setTitle(selectfile); // 設置處理播放控制器實際的對象; /**/ player.addControllerListener(this); player.prefetch(); } // 菜單狀態改變事件的響應函數; public void itemStateChanged(ItemEvent arg0) { // TODO Auto-generated method stub } public static void main(String[] args) { // TODO Auto-generated method stub new MediaPlayer("播放器"); } // 調用繪圖函數進行界面的繪制 // public void update() { // } // 繪圖函數成員 //public void paint(Graphics g) { // } public void controllerUpdate(ControllerEvent e) { // TODO Auto-generated method stub Container tainer = getContentPane(); // 調用player.close()時ControllerClosedEvent事件出現 // 如果存在視覺部件,則該部件應該拆除(為了一致起見,我們對控制面版部件也執行同樣的操作,下一次需要時再構造) if (e instanceof ControllerClosedEvent) { if (vc != null) { remove(vc); vc = null; } if (cc != null) { remove(cc); cc = null; } } // 播放結束時,將播放指針置于文件之首,如果設定了循環播放,則再次啟動播放器; if (e instanceof EndOfMediaEvent) { player.setMediaTime(new Time(0)); if (loop) { player.start(); } return; } // PrefetchCompletEvent事件發生后調用start,正式啟動播放 if (e instanceof PrefetchCompleteEvent) { player.start(); return; } // 本事件表示由于播放的資源已經確定;此時要將媒體的圖形conmopnent // 如果有顯示出來,同時將播放器player的控制顯示到窗口里; if (e instanceof RealizeCompleteEvent) { // 如果媒體中有圖像,將對應圖像component載入窗體; vc = player.getVisualComponent(); if (vc != null) tainer.add(vc, BorderLayout.CENTER); // 將對應控制器component載入窗體; cc = player.getControlPanelComponent(); cc.setBackground(Color.blue); if (cc != null) tainer.add(cc, BorderLayout.SOUTH); // 有一些特殊媒體在播放時提供另外的控制手段,將控制器一并加入窗口; /* * gc=player.getGainControl(); gcc=gc.getControlComponent(); * if(gcc!=null) tainer.add(gcc,BorderLayout.NORTH); */ // 根據媒體文件中是否有圖像,設定相應的窗口大小 if (vc != null ) { pack(); return ; } else { setSize( 300 , 75 ); setVisible( true ); return ; } } } } |
程序運行結果:
總結:
經過這幾天的Java課程設計,讓我知道了做課程設計的一般方法,通過各種努力終于完成了設計要求.這次課程設計基本上含蓋了大學一年學習到的Java語言知識點,課設題目要求不僅要求對課本知識有較深刻的了解,同時要求程序設計者有較強的思維和動手能力。這次課設使我了解我編程思想和編程技巧,也再一次熟悉了開發程序的過程,包括構思、設計、編寫、調試、修訂。
做課程設計不僅讓我修補了以前學習的漏洞,也讓我跟激發了對程序開發的興趣和自信。創新思維至關重要,這應該可以借鑒在老師的教學工作上,這不僅讓我們寫出精簡的代碼,也有助于開發出高效的程序。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。