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所示的窗口。