前言
tree组件用来表现有层级关系的数据结构再适合不过了。如下将介绍其简单用法。
一、tree
1.准备数据
//tree data
treeData := map[string][]string{
"": {"体育", "美食"},
"体育": {"羽毛球", "篮球", "跑步"},
"美食": {"川菜", "粤菜"},
}
这里需要注意:"":
表示tree 根节点,必须设置的,可以不是空串。
2.创建tree
// 创建tree
tree := widget.NewTreeWithStrings(treeData)
// 打开所有分支
tree.OpenAllBranches()
// 打开指定分支
// tree.OpenBranch("美食")
3. 选择事件
tree.OnSelected = func(uid widget.TreeNodeID) {
lb.SetText(uid)
}
二、实例
下面是一个动态的简单的文件浏览系统。
1.初始化tree
代码如下(示例):
// 创建一个空的tree组件
tree2 := widget.NewTree(nil, nil, nil, nil)
2. 创建
func refreshTree(tree2 *widget.Tree, root string) {
// 设置根节点
tree2.Root = root
// 获取子节点
tree2.ChildUIDs = func(uid widget.TreeNodeID) (c []widget.TreeNodeID) {
if uid == "" {
c = getFiles(root)
} else {
c = getFiles(uid)
}
return
}
// 创建空节点,节点是个Label组件
tree2.CreateNode = func(branch bool) (o fyne.CanvasObject) {
return widget.NewLabel("")
}
// 给每个节点的Label组件设置文本
tree2.UpdateNode = func(uid widget.TreeNodeID, branch bool, node fyne.CanvasObject) {
l := node.(*widget.Label)
l.SetText(getFileName(uid))
}
// 判断是否是分支节点
tree2.IsBranch = func(uid widget.TreeNodeID) (ok bool) {
return isDir(uid)
}
//重新渲染组件
tree2.Refresh()
}
总结
tree是一个复杂的组件,后续我们对其扩展一些实用功能,比如节点的搜索、带复选框的节点等。
附录
源代码:
https://gitee.com/gene-zhao/fyne-demo.git
更多高级用法,持续更新...