import java.applet.Applet;
import java.awt.
*
;
import java.awt.
event
.
*
;
import java.lang.String;
import java.net.URL;
import java.net.MalformedURLException;
import java.io.File;
import java.io.IOException;
import java.util.Properties;
import javax.media.
*
;
import com.sun.media.
*
;
/*
*
* This is a Java Applet that demonstrates how to create a simple
* media player with a media event listener. It will play the
* media clip right away and continuously loop.
*
* <!-- Sample HTML
* <applet code=TVApplet width=587 height=510>
* <param name=file value="sun.avi">
* </applet>
* -->
*/
public
class
TVApplet extends Applet implements ControllerListener
{
private
String fileToPlay
=
""
;
//
要播放的文件(完整的路径名称)
//
media Player
Player player
=
null
;
//
播放器
//
component in which video is playing
Component visualComponent
=
null
;
//
可视组件
//
controls gain, position, start, stop
Component controlComponent
=
null
;
//
控制组件
//
displays progress during download
Component progressBar
=
null
;
//
进度条
long
CachingSize
=
0L
;
Panel panel
=
null
;
Panel vPanel
=
null
;
int
controlPanelHeight
=
0
;
Image [] showmeImage
=
null
;
Image [] zoomImageUp
=
null
;
Image [] zoomImageDn
=
null
;
CPanel cPanel
=
null
;
ZoomButton zoomButton;
final
int
[] VLEFT
=
{
59
,
120
};
final
int
[] VTOP
=
{
33
,
67
};
final
int
[] VRIGHT
=
{
59
+
175
,
120
+
351
};
final
int
[] VBOTTOM
=
{
173
,
67
+
287
+
11
};
final
int
[] WIDTH
=
{
176
,
352
};
final
int
[] HEIGHT
=
{
138
,
288
};
final
int
HALF
=
0
;
//
小屏
final
int
FULL
=
1
;
//
全屏
int
tSize
=
0
;
/*
*
* Read the applet file parameter and create the media
* player.
*/
public
void
init()
{
setLayout(
null
);
setBackground(Color.white);
cPanel
=
new
CPanel( );
add(cPanel);
//
Figure out what size to use
//
The applet tag takes an optional parameter "SIZE" whose value
//
can be "half" or "full"
//
Eg. <param name=size value=half>
String szSize
=
"
full
"
;
//
getParameter("SIZE");
//
屏幕一般是1024*768
if
(Toolkit.getDefaultToolkit().getScreenSize().getWidth()
>
800
)
tSize
=
1
;
else
tSize
=
0
;
if
(szSize
!=
null
)
{
if
(szSize.toLowerCase().equals(
"
full
"
))
tSize
=
1
;
else
if
(szSize.toLowerCase().equals(
"
half
"
))
tSize
=
0
;
}
cPanel.setBounds(VLEFT[tSize], VTOP[tSize], WIDTH[tSize], HEIGHT[tSize]);
//
设置播放器上部分的窗口矩阵的位置
//
Get the images
showmeImage
=
new
Image[FULL
+
1
];
zoomImageUp
=
new
Image[FULL
+
1
];
zoomImageDn
=
new
Image[FULL
+
1
];
showmeImage[HALF]
=
getImage(getDocumentBase(),
"
ShowMeS2.jpg
"
);
showmeImage[FULL]
=
getImage(getDocumentBase(),
"
ShowMeS.jpg
"
);
zoomImageUp[HALF]
=
getImage(getDocumentBase(),
"
InUp.gif
"
);
zoomImageDn[HALF]
=
getImage(getDocumentBase(),
"
InDn.gif
"
);
zoomImageUp[FULL]
=
getImage(getDocumentBase(),
"
OutUp.gif
"
);
zoomImageDn[FULL]
=
getImage(getDocumentBase(),
"
OutDn.gif
"
);
addZoomButton();
//
URL for our media file
URL url
=
null
;
this
.fileToPlay
=
"
d://rr.mp3
"
;
File fileToPlay
=
new
File(
this
.fileToPlay);
try
{
//
Create an url from the file name and the url to the
//
document containing this applet.
if
((url
=
fileToPlay.toURL())
==
null
)
Fatal(
"
Can't build URL for
"
+
this
.fileToPlay);
//
Create an instance of a player for this media
try
{
player
=
Manager.createPlayer(url);
//
创建播放器
}
catch
(NoPlayerException e)
{
System.
out
.println(e);
Fatal(
"
Could not create player for
"
+
url);
}
//
Add ourselves as a listener for a player's events
player.addControllerListener(
this
);
//
为播放器事件增加监听者
}
catch
(MalformedURLException e)
{
Fatal(
"
Invalid media file URL!
"
);
}
catch
(IOException e)
{
Fatal(
"
IO exception creating player for
"
+
url);
}
}
/*
*
* Start media file playback. This function is called the
* first time that the Applet runs and every
* time the user re-enters the page.
*/
public
void
start()
{
if
(player
!=
null
)
player.realize();
}
/*
*
* Stop media file playback and release resource before
* leaving the page.
*/
public
void
stop()
{
if
(player
!=
null
)
{
player.stop();
player.deallocate();
}
}
public
void
destroy()
{
player.close();
}
public
void
paint(Graphics g)
{
if
(showmeImage[tSize]
!=
null
)
g.drawImage(showmeImage[tSize],
0
,
0
,
this
);
super.paint(g);
}
public
synchronized
void
reSize()
{
cPanel.setBounds(VLEFT[tSize], VTOP[tSize], WIDTH[tSize], HEIGHT[tSize]);
if
(visualComponent
!=
null
) {
Dimension size
=
visualComponent.getPreferredSize();
int
width
=
size.width;
int
height
=
size.height;
while
(
true
) {
//
Scale to fit
if
(width
>
WIDTH[tSize]
||
height
>
HEIGHT[tSize]) {
width
/=
2
;
height
/=
2
;
}
else
if
(width
<
WIDTH[tSize]
&&
height
<
HEIGHT[tSize]) {
if
(width
*
2
<=
WIDTH[tSize]
&&
height
*
2
<=
HEIGHT[tSize]) {
width
*=
2
;
height
*=
2
;
}
else
break
;
}
else
break
;
}
visualComponent.setBounds((WIDTH[tSize]
-
width)
/
2
,
(HEIGHT[tSize]
-
height)
/
2
,
width, height);
}
if
(controlComponent
!=
null
) {
controlComponent.setBounds(VLEFT[tSize], VBOTTOM[tSize],
WIDTH[tSize],
24
);
controlComponent.invalidate();
}
remove(zoomButton);
addZoomButton();
repaint();
}
public
void
addZoomButton()
{
zoomButton
=
new
ZoomButton(zoomImageUp[tSize], zoomImageDn[tSize],
1
-
tSize);
add(zoomButton);
zoomButton.setBounds(showmeImage[tSize].getWidth(
this
)
-
24
, showmeImage[tSize].getHeight(
this
)
-
24
,
24
,
24
);
}
/*
*
* This controllerUpdate function must be defined in order to
* implement a ControllerListener interface. This
* function will be called whenever there is a media event
*/
public
synchronized
void
controllerUpdate(ControllerEvent
event
)
{
//
If we're getting messages from a dead player,
//
just leave
if
(player
==
null
)
return
;
//
When the player is Realized, get the visual
//
and control components and add them to the Applet
if
(
event
instanceof RealizeCompleteEvent)
{
if
(( visualComponent
=
player.getVisualComponent())
!=
null
) {
cPanel.add(visualComponent);
}
if
(( controlComponent
=
player.getControlPanelComponent())
!=
null
) {
add(controlComponent);
controlComponent.setBounds(VLEFT[tSize], VBOTTOM[tSize],
WIDTH[tSize],
24
);
controlComponent.invalidate();
controlComponent.repaint();
}
reSize();
player.prefetch();
}
else
if
(
event
instanceof EndOfMediaEvent)
{
//
We've reached the end of the media; rewind and
//
start over
player.setMediaTime(
new
Time(
0
));
player.prefetch();
}
else
if
(
event
instanceof ControllerErrorEvent) {
player
=
null
;
Fatal(((ControllerErrorEvent)
event
).getMessage());
}
else
if
(
event
instanceof PrefetchCompleteEvent) {
if
(visualComponent
!=
null
) {
reSize();
}
player.start();
}
else
if
(
event
instanceof SizeChangeEvent) {
reSize();
}
}
void
Fatal (String s)
{
//
Applications will make various choices about what
//
to do here. We print a message and then exit
System.err.println(
"
FATAL ERROR:
"
+
s);
throw
new
Error(s);
//
Invoke the uncaught exception
//
handler System.exit() is another
//
choice.
}
/*
************************************************************************
* INNER CLASSES
************************************************************************
*/
public
class
CPanel extends Panel
{
public
CPanel()
{
super();
setBackground(Color.black);
setLayout(
null
);
}
}
public
class
ZoomButton extends Component
{
Image up, down;
int
newSize;
boolean mouseUp
=
true
;
public
ZoomButton(Image up, Image down,
int
newSize)
{
this
.up
=
up;
this
.down
=
down;
this
.newSize
=
newSize;
setSize(
24
,
24
);
addMouseListener(
new
MouseAdapter()
{
public
void
mousePressed(MouseEvent me)
{
mouseUp
=
false
;
repaint();
}
public
synchronized
void
mouseReleased(MouseEvent me)
{
mouseUp
=
true
;
TVApplet.
this
.tSize
=
ZoomButton.
this
.newSize;
reSize();
}
} );
}
public
void
paint(Graphics g)
{
if
(mouseUp)
g.drawImage(up,
0
,
0
,
this
);
else
g.drawImage(down,
0
,
0
,
this
);
}
}
}