DOC-13-05 使用媒体特性增强应用程序
本章将会回顾一个播放视频文件的媒体播放器应用程序,它拥有常见的视频播放器的控件,如开始/暂停按钮,播放进度条,音量控制条和一个控制重复播放的复选框。
本章的目的是熟悉javafx.scene.media包,以使开发者可以创建媒体应用。
关于媒体集成
所有JavaFX媒体应用都可以通过使用以下关键类来创建:
● Media类:表示一个媒体源
● MediaPlayer类:为指定源提供播放控制
● MediaView类:为使用MediaPlayer对象播放的视频源提供一个视图
因为MediaView类是Node类的子类,MediaView对象可以添加进JavaFX场景中。这是提供将JavaFX媒体功能集成进桌面应用和web应用基础的主要因素。你已经知道了如何将JavaFX场景嵌入Swing应用中,你随后可以整合媒体播放器组件来增强你的应用。你可以为MediaView对象设置动画、应用过渡以及应用一些特效,就像其他节点一样。按这种方法,你可以支持许多有创意的任务。
创建媒体播放器应用程序
“在JavaFX应用发布中整合媒体资源“文档提供了如何创建EmbeddedMediaPlayer应用程序的步骤说明。同时也提供了NetBeans工程源码。按照详细步骤创建应用或者使用侧边栏的链接下载工程源码。
本章中讨论的MediaPlayer应用程序基于EmbeddedMediaPlayer,但有如下细小改动:
● 作为一个最好的编程实践,应用程序使用了一个外部CSS文件。
● 控制栏包含一个Loop复选框来控制重复播放。
应用窗口如图5-1所示。
图5-1 媒体播放器应用程序窗口
你可以直接修改EmbeddedMediaPlayer工程或复制一份重命名并在新工程中修改。
使用CSS装饰应用程序
为了使用CSS来装饰应用程序,首先创建mediaplayer.css文件并保存在应用程序源代码的的文件夹中。添加如例5-1所示的样式规则。
例5-1
1 2 3 4 5 6 |
#mediaControl { -fx-background-color: #bfc2c7; } #mediaViewPane { -fx-background-color: black;; } |
下一步,打开MediaControl.java文件,去掉MediaControl构造器中如例5-2所示的代码。
例5-2
1 2 |
setStyle("-fx-background-color: #bfc2c7;"); mvPane.setStyle("-fx-background-color: black;"); |
修改MediaControl构造器,加入例5-3中加粗表示的代码。
例5-3
1 2 3 4 5 6 7 8 9 |
public MediaControl(final MediaPlayer mp) { this.mp = mp; setId("mediaControl"); mediaView = new MediaView(mp); Pane mvPane = new Pane(); mvPane.getChildren().add(mediaView); mvPane.setId("mediaViewPane"); setCenter(mvPane); |
在控制栏添加一个新的控件
添加一个新的控件到控制栏中只需要几个步骤。在你定义MediaControl类实例的变量那一段,去掉repeat变量的定义,如例5-4所示。
例5-4
1 |
private final boolean repeat = false; |
在MediaControl类中,去掉使用repeat变量的代码,如例5-5所示。
例5-5
1 |
mp.setCycleCount(repeat ? MediaPlayer.INDEFINITE : 1); |
现在,添加repeatBox变量,如例5-6所示。
例5-6
1 |
private CheckBox repeatBox; |
在你的媒体播放器的控制栏中添加一个标签和复选框。将如下代码放到MediaControl构造器中添加volumeSlider的代码行后面。如例5-7所示。
例5-7
1 2 3 4 5 6 7 8 9 10 11 12 |
mediaBar.getChildren().add(volumeSlider); Label repeatLabel = new Label(" Loop: "); repeatLabel.setPrefWidth(50); repeatLabel.setMinWidth(25); mediaBar.getChildren().add(repeatLabel); repeatBox = new CheckBox(); repeatBox.setSelected(true); mediaBar.getChildren().add(repeatBox); setBottom(mediaBar); |
在setOnEndOfMedia方法中实现使用复选框的逻辑,如例5-8所示。
例5-8
1 2 3 4 5 6 7 8 9 10 11 12 13 |
mp.setOnEndOfMedia(new Runnable() { public void run() { if (repeatBox.isSelected()) { mp.seek(mp.getStartTime()); } else { playButton.setText(">"); stopRequested = true; atEndOfMedia = true; } } }); |
为了使媒体播放器可以在防火墙内访问一个远程媒体资源,提供了如下格式的代理设置:-Dhttp.proxyHost=yourproxyhost.com -Dhttp.proxyPort=portNumber。在这段设置中,yourproxyhost.com是你的代理地址,portNumber是使用的端口号。
应用程序文件
源代码
NetBeans工程

