欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

javafx实现树结构treeview

程序员文章站 2022-06-08 10:34:00
...
如果我没记错,javafx1.2是不支持treeview的,为了实现一个treeview,还借用了jfxtras组织的一个框架,1.3提供了对treeview的支持,当时一个叫Rakesh Menon的阿三哥在他的博客上[url=http://rakeshmenonp.wordpress.com/2010/05/10/javafx-1-3-treeview/]http://rakeshmenonp.wordpress.com/2010/05/10/javafx-1-3-treeview/[/url]发表了如何利用treeview来读取一个系统目录结构,展示端他用的是以当前目录作为书节点名,并对当前节点进行循环,如何依照给定的xml文件进行操作,把文件内容进行树状展示,遇到了一个展示内容方面的问题,对此,我对TreeItem进行了扩展,通过对这个类的扩展增加展示元素属性,并利用传统的dom4j方式对xml文件进行读取。下面是我的实现:
import javafx.scene.CustomNode;
import javafx.scene.Node;
import com.javafx.preview.control.TreeView;
import org.dom4j.io.SAXReader;
import org.dom4j.Document;
import org.dom4j.Element;
import com.javafx.preview.control.TreeItemBase;
import javafx.scene.Group;
import javafx.scene.Cursor;
/**
* @author fuqingyan
*/
public class TreeViewNode extends CustomNode {

public var width: Number;
public var height: Number;
var reader: SAXReader = new SAXReader();
var doc: Document = reader.read("{__DIR__}test.xml");
var tree: TreeView = TreeView {
cursor: Cursor.HAND
root: TreeItemExt {
data: doc.getRootElement().getName()
element: doc.getRootElement()
expanded: false
isLeaf: isLeaf
createChildren: createChildren;
}
width: bind width / 5
height: bind height
}

override public function create(): Node {
Group {
content: bind [
tree ]
}
}

function createChildren(item: TreeItemBase): TreeItemBase[] {

def itemEx = item as TreeItemExt;
def elm = itemEx.element as Element;
if (elm.elements().size() > 0) {
return for (e in elm.elements()) {
var binds = e as Element;
TreeItemExt {
data: binds.attributeValue("name");
element: binds
createChildren: createChildren;
isLeaf: isLeaf;
}
};
}
return [];
}
function isLeaf(item: TreeItemBase): Boolean {
def itemEx = item as TreeItemExt;
def elm = itemEx.element as Element;
return elm.elements().size() < 1;
}

下面是扩展TreeItem

import com.javafx.preview.control.TreeItem;
import org.dom4j.Element;

/**
* @author fuqingyan
*/

public class TreeItemExt extends TreeItem {

public var element: Element;
}


稍微做下说明,TreeItem TreeView TreeItemBase这几个类之间的关系看一下api文档,如果重写了createChildren方法,就一定要重写isLeaf。
fx方面的ide,NetBeans的比Eclipse的要好一点,我个人实践后的体会。
给定一个xml格式的文件,读取后就可以树状展示出来了,有空继续写一下操作treeview的节点进行交互。