列表、表格、树形控件是桌面工具里很常见的界面。Fyne 的 List、Table、Tree 都采用回调方式生成和更新内容,不是一次性创建所有行。
List
1 2 3 4 5 6 7 8 9 10 11 12 13
| items := []string{"config.yaml", "README.md", "main.go"}
list := widget.NewList( func() int { return len(items) }, func() fyne.CanvasObject { return widget.NewLabel("template") }, func(id widget.ListItemID, obj fyne.CanvasObject) { obj.(*widget.Label).SetText(items[id]) }, )
|
第一个函数返回数量,第二个函数创建模板控件,第三个函数把数据填进去。
Table
表格适合日志、任务列表、文件属性等二维数据。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| data := [][]string{ {"文件", "大小"}, {"main.go", "2 KB"}, {"go.mod", "1 KB"}, }
table := widget.NewTable( func() (int, int) { return len(data), len(data[0]) }, func() fyne.CanvasObject { return widget.NewLabel("") }, func(id widget.TableCellID, obj fyne.CanvasObject) { obj.(*widget.Label).SetText(data[id.Row][id.Col]) }, )
|
如果数据变化,更新切片后调用:
Tree
树形控件适合目录结构、配置层级、分类导航。它需要告诉 Fyne 某个节点是否有子节点,以及子节点有哪些。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| tree := widget.NewTree( func(id widget.TreeNodeID) []widget.TreeNodeID { if id == "" { return []widget.TreeNodeID{"src", "docs"} } if id == "src" { return []widget.TreeNodeID{"main.go"} } return nil }, func(id widget.TreeNodeID) bool { return id == "" || id == "src" || id == "docs" }, func(branch bool) fyne.CanvasObject { return widget.NewLabel("") }, func(id widget.TreeNodeID, branch bool, obj fyne.CanvasObject) { obj.(*widget.Label).SetText(id) }, )
|
使用建议
少量选项用普通容器就够了。数据多、需要滚动、需要复用行控件时,再使用 List、Table、Tree。