JavaFX学习之简单浏览器添加书签功能实现

我们在之前的JavaFX学习中已经将简单浏览器标签页功能实现了,浏览器书签栏是在每个Tab页中各自维护一份的。今天继续实现添加书签的功能,需要用到这个书签栏。

首先我们要增加一个添加书签的按钮,通过点击该按钮显示添加书签的窗口,再保存书签。这个按钮也需要在每个标签页中各自维护一份,我们把这个按钮放置在地址栏之后,在之前的MyTab类中添加该按钮。

接着我们需要一个添加书签的窗口,这次我们使用统一的书签管理窗口。通过之前JavaFX基础的学习,我们知道在JavaFX场景中各组件存在层次关系,我们在场景最前面层绘制这个书签管理窗口,默认设置为不可见,当点击添加书签时将该窗口设置为可见。该窗口中两个输入框需要进行组件绑定,两个按钮需要进行事件绑定。具体绘制界面如下图所示:

我们设定左键单击书签时在新标签页中打开书签,CTRL+左键单击时在当前页打开书签,右键单击时编辑书签。书签我们用xml文件来保存,建立一个数据模型Bookmark,再创建一个XML文件读写工具类JaxbUtil,这两个文件具体在作者github中查看,这里不再贴出。事件处理代码如下:

/**

* 保存书签

*/

@FXML

private void saveBookmark() {

addBookmark(bookmarkName.getText(), bookmarkAddress.getText());

hideBookmark();

Bookmark bm = new Bookmark();

bookmarks.forEach((t) -> {

Label l = (Label) t;

bm.addBookmark(l.getText(), l.getUserData().toString());

});

JaxbUtil.saveToXML(bm, JaxbUtil.BOOKMARK_FILE);//将书签存储到文件

}

/**

* 隐藏书签管理窗口

*/

@FXML

public void hideBookmark() {

bookmarkPane.setVisible(false);

}

/**

* 添加书签

*

* @param name

* @param url

*/

public void addBookmark(String name, String url) {

Object data = bookmarkPane.getUserData();

String tooltip = "右键点击修改\n左键单击新标签页打开书签\nCTRL+左键单击当前页打开书签\n" + name + "\n" + url;

if (data != null) {//修改书签

Label node = (Label) data;

node.setText(name);

node.setUserData(url);

node.setTooltip(new Tooltip(tooltip));

} else {//添加书签

Label node = new Label(name);

node.setMaxWidth(100);

node.setUserData(url);

node.setTooltip(new Tooltip(tooltip));

node.setCursor(Cursor.HAND);

node.setOnMouseClicked((event) -> {//书签点击事件处理

String ul = node.getUserData().toString();

if (MouseButton.SECONDARY.equals(event.getButton())) {

showBookmarkPane(node.getText(), ul, node);

} else if (event.isControlDown()) {//CTRL+单击事件

MyTab mt = (MyTab) tabPane.getSelectionModel().getSelectedItem();

mt.load(ul);

} else {

MyTab mt = new MyTab(ul, this);

tabPane.getTabs().add(mt);

tabPane.getSelectionModel().select(mt);

}

});

bookmarks.add(node);

}

}

今天就先学习到这,代码已经提交到github:https://github.com/ajtdnyy/JavaFXDemo 每天进步一点点,贵在坚持。看下今天的效果图:

You may also like...

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据