JavaFX媒体类使用与Web服务访问
立即解锁
发布时间: 2025-08-19 02:14:57 阅读量: 2 订阅数: 8 


JavaFX 2:Java技术的富客户端开发指南
# JavaFX媒体类使用与Web服务访问
## 1. JavaFX媒体类概述
JavaFX平台的媒体类是其重要组成部分,主要功能及使用方法如下:
- **播放低延迟音效**:可使用`AudioClip`类来播放低延迟的音效。
- **加载媒体类型**:能将JavaFX支持的各种媒体类型加载到`Media`对象中。
- **播放音频文件**:借助`MediaPlayer`类,可播放来自`.jar`文件、磁盘或通过网络加载的音频文件。
- **构建媒体播放器**:可以构建一个带有图形用户界面的简单媒体播放器,用于控制音频文件的播放。
- **利用音频功能**:能够利用`MediaPlayer`的均衡器和音频频谱功能。
- **播放视频文件**:使用`MediaView`类来播放视频文件。
- **使用媒体标记**:可以使用媒体标记在媒体播放期间触发事件。
- **分割视频播放**:可将视频播放分割成多个视口。
## 2. JavaFX与企业系统集成
### 2.1 前后端平台概述
JavaFX常被视为前端平台,多数JavaFX应用侧重于“内容”的丰富交互式可视化。而Java语言可在多种设备、桌面和服务器上使用,JavaFX的核心语言也是Java Platform, Enterprise Edition (Java EE) 的基础核心。Java平台是企业应用的首要开发平台,将提供丰富交互式用户界面的JavaFX平台与运行在Java平台上的企业应用相结合,能创造巨大的可能性,这就需要JavaFX应用和Java企业应用进行数据交换。
### 2.2 数据交换的两种方式
- **深度集成**:JavaFX应用可利用其与典型企业应用运行在同一基础设施的优势,与这些企业组件进行深度集成。
- **标准协议交换**:JavaFX应用运行在相对简单的Java平台上,使用Java企业组件已支持的标准协议与企业服务器交换数据。本文重点关注第二种方式,且只要使用标准、定义明确的协议(如SOAP/REST),就可将JavaFX应用连接到非Java后端应用。
### 2.3 JavaFX与Java企业模块融合
JavaFX 2基于Java Platform, Standard Edition构建,因此可利用该平台提供的所有功能。Java Platform, Enterprise Edition同样基于此标准版构建,所以JavaFX应用可与使用Java EE的应用在同一环境中运行。这样,JavaFX开发者就能使用自己喜欢的企业工具来创建应用,具有诸多优势,例如企业组件提供的工具可让开发者专注于特定领域层,屏蔽数据库资源和事务等细节。
Java EE由通过Java Community Process (JCP) 程序标准化的规范定义,当前Java EE 6版本包含众多Java Specification Requests (JSRs),如`Java API for RESTful Web Services (JAX - RS) 1.1 (JSR 311)`等。许多公司实现了这些JSRs,典型的企业组件会实现一个或多个JSRs,并可能包含特定于产品的功能。流行的企业组件包括Spring Framework、Guice、Tomcat等。
不过,企业开发与客户端开发存在一些差异:
| 对比项 | 企业开发 | 客户端开发 |
| ---- | ---- | ---- |
| 基础设施 | 向云转移,特定任务外包给云组件 | 无此特点 |
| 资源需求 | 关注计算资源(CPU、缓存和内存) | 关注视觉资源(如图形硬件加速) |
| 启动时间 | 不太重要,服务器需24/7运行 | 至关重要 |
| 部署和生命周期管理 | 特定于服务器产品,升级繁琐,需最小化停机时间 | 可通过多种方式部署,如JNLP |
| 开发模式 | 使用一些特定模式(如控制反转、基于容器的初始化),常需不同架构 | 传统架构为主 |
## 3. 使用JavaFX调用远程Web服务
### 3.1 协议概述
企业组件常通过Web资源访问,存在多种规范允许从非Web资源访问企业组件。1998年,Microsoft发明了SOAP,它基于XML,当前版本1.2于2003年成为W3C推荐标准,Java提供了与SOAP交换数据的工具。但SOAP较为冗长,随着混搭和简单服务的兴起,出现了REST协议,它允许服务器和客户端开发者以松散耦合的方式交换数据,协议格式可以是XML、JSON、Atom等。
### 3.2 REST服务访问
本文后续主要介绍调用基于REST的Web服务。Web REST服务会暴露一些可通过HTTP协议访问的统一资源标识符(URIs),通常使用不同的HTTP请求方法(如get、post、put、delete)来表示对资源的不同操作。Java平台提供了一些API(主要在`java.io`和`java.net`中)来方便访问基于REST的Web服务,JavaFX基于Java 2 Platform, Standard Edition构建,因此可在JavaFX应用中使用这些API。
### 3.3 应用设置
我们以获取推文并在JavaFX控件中渲染为例进行说明。首先定义一个`Tweet`类来表示推文:
```java
public class Tweet {
private String author;
private String title;
private String timeStamp;
public Tweet() {
}
public Tweet(String a, String t, String s) {
this.author = a;
this.title = t;
this.timeStamp = s;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getTimeStamp() {
return timeStamp;
}
public void setTimeStamp(String timeStamp) {
this.timeStamp = timeStamp;
}
}
```
### 3.4 显示推文示例
以下是一个在`ListView`中显示推文的示例代码:
```java
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.ListView;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class TweetApp1 extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("TweetList");
ListView<Tweet> listView = new ListView<Tweet>();
listView.setItems(getObservableList());
StackPane root = new StackPane();
root.getChildren().add(listView);
primaryStage.setScene(new Scene(root, 500, 300));
primaryStage.show();
}
ObservableList<Tweet> getObservableList() {
ObservableList<Tweet> answer = FXCollections.observableArrayList();
Tweet t1 = new Tweet("JavaFXFan", "I love JavaFX!!", "today");
Tweet t2 = new Tweet("JavaDeveloper", "Developing \"Hello World\" in JavaFX...", "yesterday");
answer.addAll(t1, t2);
return answer;
}
}
```
该示例中,推文是硬编码的。为了更好地显示推文信息,我们可以自定义`CellFactory`:
```java
import javafx.scene.control.ListCell;
public class TweetCell extends ListCell<Tweet> {
@Override
protected void updateItem(Tweet tweet, boolean b) {
if (tweet != null) {
StringBuilder sb = new StringBuilder();
sb.append("[").append(tweet.getTimeStamp()).append("]").
append(tweet.getAuthor()).append(": ").append(tweet.getTitle());
setText(sb.toString());
}
}
}
```
然后在`start`方法中使用:
```java
public void start(Stage primaryStage) {
primaryStage.setTitle("TweetList");
ListView<Tweet> listView = new ListView<Tweet>();
listView.setItems(getObservableList());
listView.setCellFactory(new Callback<ListView<Tweet>, ListCell<Tweet>>() {
@Override
public ListCell<Tweet> call(ListView<Tweet> listview) {
return new TweetCell();
}
});
StackPane root = new StackPane();
root.getChildren().add(listView);
primaryStage.setScene(new Scene(root, 500, 30));
primaryStage.show();
}
```
### 3.5 使用Twitter API获取推文
Twitter允许第三方开发者使用基于REST的接口来浏览和访问推文,我们使用其Search API。资源URL为`http://search.twitter.com/search.format?q=searchterm`,其中`search.format`定义响应格式,目前支持JSON、atom和RSS;`searchterm`定义搜索查询。以获取“javafx”相关推文为例:
- **JSON格式**:请求URL为`http://search.twitter.com/search.json?q=javafx`,响应示例如下:
```json
{"completed_in":0.032,
"max_id":156099093272346624,
"max_id_str":"156099093272346624",
"next_page":"page=2&max_id=156099093272346624&q=javafx",
"page":1,
"query":"javafx",
"refresh_url":"?since_id=156099093272346624&q=javafx",
"results":[
{"created_at":"Sun, 08 Jan 2012 19:44:58+0000",
"from_user":"ITfacto",
"from_user_id":435927432,
"from_user_id_str":"435927432",
"from_user_name":"ITfacto",
"geo":null,
"id":156099093272346624,
"id_str":"156099093272346624",
"iso_language_code":"fr",
"metadata":{"result_type":"recent"},
"profile_image_url":"http://a1.twimg.com/profile_images/1704224541/ITfacto_mini_normal.JPG",
"profile_image_url_https":"https://si0.twimg.com/profile_images/1704224541/ITfacto_mini_normal.JPG",
"source":"<a href=\"http://twitterfeed.com\" rel=\"nofollow\">twitterfeed</a>",
"text":"#J2EE NetBeans IDE 7.1 : Oracle met en avant JavaFX 2.0 et PHP - Journal du Net http://t.co/j9GK25ET",
"to_user":null,
"to_user_id":null,
"to_user_id_str":null,
"to_user_name":null
},
{ <other tweets omitted> }
],"results_per_page":15,"since_id":0,"since_id_str":"0"}
```
- **XML(RSS)格式**:请求URL为`http://search.twitter.com/search.rss?q=javafx`,响应示例如下:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:google="http://base.google.com/ns/1.0"
xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/"
xmlns:media="http://search.yahoo.com/mrss/" xmlns:twitter="http://api.twitter.com/">
<channel>
<title>javafx - Twitter Search</title>
<description>javafx - Twitter Search</description>
<link>http://search.twitter.com/search?q=javafx</link>
<twitter:refresh_url>http://search.twitter.com/search.rss?since_id=156099093272346624&q=javafx</twitter:refresh_url>
<pubDate>Sun, 08 Jan 2012 19:44:58 +0000</pubDate>
<openSearch:itemsPerPage>15</openSearch:itemsPerPage>
<item>
<title>#J2EE NetBeans IDE 7.1 : Oracle met en avant JavaFX 2.0 et PHP – Journal du Net http://t.co/j9GK25ET</title>
<link>http://twitter.com/ITfacto/statuses/156099093272346624</link>
<description><a href="http://search.twitter.com/search?q=%23J2EE" title="#J2EE" class=" ">#J2EE</a> NetBeans IDE 7.1 : Oracle met en avant <em>JavaFX</em> 2.0 et PHP - Journal du Net <a href="http://t.co/j9GK25ET">http://t.co/j9GK25ET</a></description>
<pubDate>Sun, 08 Jan 2012 19:44:58 +0000</pubDate>
<guid>http://twitter.com/ITfacto/statuses/156099093272346624</guid>
<author>[email protected] (Itfacto)</author>
<media:content type="image/jpg" height="48" width="48" url="http://a1.twimg.com/profile_images/1704224541/ITfacto_mini_normal.JPG"/>
<google:image_link>http://a1.twimg.com/profile_images/1704224541/ITfacto_mini_normal.JPG</google:image_link>
<twitter:metadata>
<twitter:result_type>recent</twitter:result_type>
</twitter:metadata>
</item>
<Other items omitted>
</channel>
</rss>
```
### 3.6 JSON响应格式处理
#### 3.6.1 手动解析JSON
以下是手动解析JSON响应的代码:
```java
ObservableList<Tweet> getObservableList() throws IOException {
ObservableList<Tweet> answer = FXCollections.observableArray
```
0
0
复制全文
相关推荐









