Fyne 系列 06:List、Table、Tree 处理大量数据
cbowen

列表、表格、树形控件是桌面工具里很常见的界面。Fyne 的 ListTableTree 都采用回调方式生成和更新内容,不是一次性创建所有行。

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])
},
)

如果数据变化,更新切片后调用:

1
table.Refresh()

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)
},
)

使用建议

少量选项用普通容器就够了。数据多、需要滚动、需要复用行控件时,再使用 ListTableTree

 评论
评论插件加载失败
正在加载评论插件