javafx实现树结构treeview

如果我没记错,javafx1.2是不支持treeview的,为了实现一个treeview,还借用了jfxtras组织的一个框架,1.3提供了对treeview的支持,当时一个叫Rakesh Menon的阿三哥在他的博客上 http://rakeshmenonp.wordpress.com/2010/05/10/javafx-1-3-treeview/发表了如何利用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的节点进行交互。

你可能感兴趣的:(eclipse,xml,wordpress,Netbeans,JavaFX)