JavaFX在Web开发中的应用实践
立即解锁
发布时间: 2025-08-18 02:24:40 阅读量: 3 订阅数: 14 

### JavaFX在Web开发中的应用实践
#### 1. 基于Yahoo天气服务的JavaFX应用
在开发JavaFX应用以获取Yahoo天气服务的XML信息时,我们可以按照以下步骤进行:
1. **获取本地天气的RSS URL**:
- 打开浏览器,访问http://weather.yahoo.com/。
- 输入城市名或邮政编码,然后点击“Go”按钮。
- 点击网页右侧(“Add weather to your website”下方)橙色的小RSS按钮。
- 复制浏览器地址栏中的URL,用于天气应用代码中。例如:http://weather.yahooapis.com/forecastrss?p=USMD0033&u=f。
2. **创建JavaFX应用**:
- **定义实例变量**:创建`ManipulatingHtmlContent`类时,需要两个实例变量`url`和`refreshCountdown`。`url`赋值为步骤4中获取的RSS URL,`refreshCountdown`类型为`int`,赋值为60,表示刷新或再次获取天气信息的时间间隔(秒)。
- **创建场景和WebEngine**:在`start()`方法中,首先创建`Scene`对象作为初始主内容区域,然后通过传入`url`创建`javafx.scene.web.WebEngine`实例,该对象将异步加载Yahoo天气服务的网页内容。
```java
final WebEngine webEngine = new WebEngine(url);
```
- **创建HTML模板**:使用`StringBuilder`创建HTML文档模板,用于后续网页内容的组装。
```java
StringBuilder template = new StringBuilder();
template.append("<head>\n")
.append("<style type=\"text/css\">body {background-color:#b4c8ee;}</style>\n")
.append("</head>\n")
.append("<body id='weather_background'>");
```
- **创建WebView对象**:创建`WebView`对象实例,用于渲染网页。`WebView`会有自己的`WebEngine`实例,我们使用`WebView`节点来渲染组装好的HTML网页,而通过`WebEngine`对象从Yahoo天气服务获取XML信息进行解析,再将解析结果传递给`WebView`显示为HTML。
```java
final WebView webView = new WebView();
```
- **创建倒计时定时器**:
- 实例化`IntegerProperty`变量`countdown`,用于保存到下一次刷新的剩余秒数。
- 添加`ChangeListener`,使用JavaFX执行JavaScript的能力动态更新HTML内容,并在倒计时为0时调用`webEngine`的`reload()`方法刷新天气信息。
```java
IntegerProperty countDown = new SimpleIntegerProperty(refreshCountdown);
countDown.addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue){
webView.getEngine().executeScript("document.getElementById('countdown').innerHTML = 'Seconds till refresh: " + newValue + "'");
if (newValue.intValue() == 0) {
webEngine.reload();
}
}
});
```
- **更新倒计时**:使用`Timeline`对象更新`countDown`变量,触发`ChangeListener`更新HTML中显示的倒计时文本。
```java
final Timeline timeToRefresh = new Timeline();
timeToRefresh.getKeyFrames().addAll(
new KeyFrame(Duration.ZERO, new KeyValue(countDown, refreshCountdown)),
new KeyFrame(Duration.seconds(refreshCountdown), new KeyValue(countDown, 0))
);
```
- **解析和显示天气数据**:当`webEngine`完成XML信息的获取后,使用`ChangeListener`解析并将组装好的网页内容渲染到`webView`节点中。
```java
if (newValue != State.SUCCEEDED) {
return;
}
Weather weather = parse(webEngine.getDocument());
String countdownText = "<b id=\"countdown\"></b><br />\n";
webView.getEngine().loadContent(fullHtml + location.toString() + timeOfWeatherTextDiv + countdownText + weather.htmlDescription);
```
- **解析XML数据**:通过`webEngine`的`getDocument()`方法返回的`org.w3c.dom.Document`对象,使用`parse()`方法遍历DOM树获取天气数据,并返回`Weather`对象。
#### 2. 响应HTML事件
为天气应用添加额外功能,响应用户操作:
1. **问题描述**:担心同事忽略即将到来的风暴,想通过天气应用提醒他们带伞。
2. **解决方案**:在天气应用中添加“Panic Button”和“Calm Down”按钮,分别模拟邮件通知和撤销警告消息。
```java
@Override public void start(Stage stage) {
// ... 模板构建代码
template.append("<body id='weather_background'>");
template.append("<form>\n");
template.append(" <input type=\"button\" onclick=\"alert('warning')\" value=\"Panic Button\" />\n");
template.append(" <input type=\"button\" onclick=\"alert('unwarning')\" value=\"Calm down\" />\n");
template.append("</form>\n");
// 创建警告消息,初始透明度为0,使其不可见
final Text warningMessage = createMessage(Color.RED, "warning: ");
warningMessage.setOpacity(0);
// ... 倒计时代码
// 当天气信息成功获取后,更新警告消息
webEngine.getLoadWorker().stateProperty().addListener(new ChangeListener<State>() {
public void changed(ObservableValue<? extends State> observable, State oldValue, State newValue){
System.out.println("done!" + newValue.toString());
if (newValue != State.SUCCEEDED) {
return;
}
Weather weather = parse(webEngine.getDocument());
warningMessage.setText("Warning: " + weather.currentWeatherText + "\nTemp: " + weather.temperature + "\n E-mailed others");
// ... 其余changed()方法代码
}
});
// 设置OnAlert属性,处理按钮点击事件
webView.getEngine().setOnAlert(new EventHandler<WebEvent<String>>(){
public void handle(WebEvent<String> evt) {
warningMessage.setOpacity("warning".equalsIgnoreCase(evt.getData()) ? 1d : 0d);
}
});
root.getChildren().addAll(webView, warningMessage);
stage.setScene(scene);
stage.show();
}
private Text createMessage(Color color, String message) {
DropShadow dShadow = DropShadowBuilder.create()
.offsetX(3.5f)
.offsetY(3.5f)
.build();
Text textMessage = TextBuilder.create()
.text(message)
.x(100)
.y(50)
.strokeWidth(2)
.stroke(Color.WHITE)
.effect(dShadow)
.fill(color)
.font(Font.font(null, FontWeight.BOLD, 35))
.translateY(50)
.build();
return textMessage;
}
```
其工作原理如下:使用`<input type=”button”>`标签添加按钮,并设置`onclick`属性调用JavaScript的`alert()`函数。当按钮被点击时,`alert()`函数会触发,通过`WebEngine`的`OnAlert`属性通知JavaFX,我们添加事件处理程序`EventHandler`来响应`WebEvent`对象,根据事件数据切换警告消息节点的透明度,从而显示或隐藏警告消息。
#### 3. 数据库内容显示(JavaFX RSS阅读器)
为了及时了解本地立法和科学新闻,我们可以创建一个JavaFX RSS阅读器,将RSS源URL存储在数据库中,后续进行检索。
1. **准备工作**:使用Apache的嵌入式数据库Derby,需要从http://db.apache.org/derby/derby_downloads.html 下载最新版本的软件,解压到指定目录。编译和运行代码时,需要更新IDE的类路径或环境变量,指向Derby库文件(derby.jar和derbytools.jar)。
2. **实现RSS阅读器**:以下是JavaFX实现RSS阅读器的代码:
```java
package org.java7recipes.chapter20.recipe20_05;
import java.util.*;
import javafx.application.Application;
import javafx.beans.value.*;
import javafx.collections.ObservableList;
import javafx.concurrent.Worker.State;
import javafx.event.*;
import javafx.geometry.*;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.scene.input.*;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.scene.w
```
0
0
复制全文
相关推荐










