8 管理Web历史记录
本章介绍了WebHistory类,并教授如何获取和显示已访问页面的URL。
您可以使用WebHistory类获取已访问页面的列表。它表示与WebEngine对象关联的会话历史记录。使用WebEngine.getHistory()方法获取特定Web引擎的WebHistory实例,如下所示:WebHistory history = webEngine.getHistory();。
历史记录基本上是一个条目列表。每个条目表示一个已访问页面,并提供访问相关页面信息,如URL、标题和页面最后访问日期。可以使用getEntries()方法获取列表。
随着用户在Web上导航,历史记录列表会发生变化。使用ObservableList API来处理这些变化。
获取访问页面列表
通常使用标准或自定义的UI控件来显示历史记录列表。示例8-1展示了如何获取历史记录项并在ComboBox控件中展示它们。
示例8-1 获取和处理Web历史记录项列表
final WebHistory history = webEngine.getHistory();
history.getEntries().addListener(new
ListChangeListener<WebHistory.Entry>() {
@Override
public void onChanged(Change<? extends Entry> c) {
c.next();
for (Entry e : c.getRemoved()) {
comboBox.getItems().remove(e.getUrl());
}
for (Entry e : c.getAddedSubList()) {
comboBox.getItems().add(e.getUrl());
}
}
}
);
comboBox.setPrefWidth(60);
comboBox.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent ev) {
int offset =
comboBox.getSelectionModel().getSelectedIndex()
- history.getCurrentIndex();
history.go(offset);
}
});
ListChangeListener对象跟踪历史记录项的更改,并将相应的URL添加到组合框中。
当用户在组合框中选择任何项时,Web引擎将导航到由历史记录项定义的URL,该项在列表中的位置由offset值定义。负的offset值指定当前项之前的位置,正的offset值指定当前项之后的位置。
示例8-2展示了修改后应用程序的完整代码。
示例8-2 带有历史记录下拉框的WebViewSample
final ComboBox comboBox = new ComboBox(); comboBox.setPrefWidth(60); toolBar.getChildren().add(comboBox); //处理历史记录 final WebHistory history = webEngine.getHistory(); history.getEntries().addListener( (ListChangeListener.Change<? extends WebHistory.Entry> c) -> { c.next(); c.getRemoved().stream().forEach((e) -> { comboBox.getItems().remove(e.getUrl()); }); c.getAddedSubList().stream().forEach((e) -> { comboBox.getItems().add(e.getUrl()); }); }); //设置历史记录下拉框的行为 comboBox.setOnAction((Event ev) -> { int offset = comboBox.getSelectionModel().getSelectedIndex() - history.getCurrentIndex(); history.go(offset); });
当您编译和运行应用程序时,它会产生如图8-1所示的窗口。

