Fyne 是一个用于构建跨平台 GUI 应用程序的 Go 语言框架。它提供了多种布局组件,用于管理和排列窗口中的控件。Fyne 的布局组件可以帮助开发者轻松地创建响应式和美观的用户界面。以下是 Fyne 中常用的布局组件的详细讲解:
1. VBox
和 HBox
VBox
:垂直布局,将控件从上到下排列。HBox
:水平布局,将控件从左到右排列。
import (
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
func main() {
a := app.New()
w := a.NewWindow("VBox and HBox Example")
btn1 := widget.NewButton("Button 1", func() {})
btn2 := widget.NewButton("Button 2", func() {})
btn3 := widget.NewButton("Button 3", func() {})
vbox := container.NewVBox(btn1, btn2, btn3)
hbox := container.NewHBox(btn1, btn2, btn3)
w.SetContent(container.NewVBox(vbox, hbox))
w.ShowAndRun()
}
2. GridLayout
GridLayout
:网格布局,将控件排列在网格中。可以指定行数和列数。
import (
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
func main() {
a := app.New()
w := a.NewWindow("GridLayout Example")
btn1 := widget.NewButton("Button 1", func() {})
btn2 := widget.NewButton("Button 2", func() {})
btn3 := widget.NewButton("Button 3", func() {})
btn4 := widget.NewButton("Button 4", func() {})
grid := container.NewGridWithColumns(2, btn1, btn2, btn3, btn4)
w.SetContent(grid)
w.ShowAndRun()
}
3. BorderLayout
BorderLayout
:边框布局,将控件放置在窗口的四个边框和中心位置。
import (
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
func main() {
a := app.New()
w := a.NewWindow("BorderLayout Example")
top := widget.NewLabel("Top")
bottom := widget.NewLabel("Bottom")
left := widget.NewLabel("Left")
right := widget.NewLabel("Right")
center := widget.NewLabel("Center")
border := container.NewBorder(top, bottom, left, right, center)
w.SetContent(border)
w.ShowAndRun()
}
4. CenterLayout
CenterLayout
:居中布局,将控件放置在窗口的中心位置。
import (
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
func main() {
a := app.New()
w := a.NewWindow("CenterLayout Example")
btn := widget.NewButton("Center Button", func() {})
center := container.NewCenter(btn)
w.SetContent(center)
w.ShowAndRun()
}
5. FormLayout
FormLayout
:表单布局,用于创建表单界面,通常用于排列标签和输入框。
import (
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
func main() {
a := app.New()
w := a.NewWindow("FormLayout Example")
name := widget.NewEntry()
email := widget.NewEntry()
form := &widget.Form{
Items: []*widget.FormItem{
{Text: "Name", Widget: name},
{Text: "Email", Widget: email},
},
}
w.SetContent(form)
w.ShowAndRun()
}
6. Scroll
Scroll
:滚动布局,用于在控件内容超出窗口大小时提供滚动功能。
import (
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
func main() {
a := app.New()
w := a.NewWindow("Scroll Example")
content := widget.NewLabel("This is a long text that will require scrolling to view all of it.")
scroll := container.NewScroll(content)
w.SetContent(scroll)
w.ShowAndRun()
}
7. Split
Split
:分割布局,将窗口分割为多个部分,用户可以调整分割线的大小。
import (
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
func main() {
a := app.New()
w := a.NewWindow("Split Example")
left := widget.NewLabel("Left Panel")
right := widget.NewLabel("Right Panel")
split := container.NewHSplit(left, right)
w.SetContent(split)
w.ShowAndRun()
}
8. TabContainer
TabContainer
:选项卡布局,用于在多个选项卡之间切换内容。
import (
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
func main() {
a := app.New()
w := a.NewWindow("TabContainer Example")
tab1 := container.NewTabItem("Tab 1", widget.NewLabel("Content of Tab 1"))
tab2 := container.NewTabItem("Tab 2", widget.NewLabel("Content of Tab 2"))
tabs := container.NewAppTabs(tab1, tab2)
w.SetContent(tabs)
w.ShowAndRun()
}
9. MaxLayout
MaxLayout
:最大化布局,将控件最大化填充整个窗口。
import (
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
func main() {
a := app.New()
w := a.NewWindow("MaxLayout Example")
btn := widget.NewButton("Max Button", func() {})
max := container.NewMax(btn)
w.SetContent(max)
w.ShowAndRun()
}
10. Padded
Padded
:填充布局,为控件添加内边距。
import (
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
func main() {
a := app.New()
w := a.NewWindow("Padded Example")
btn := widget.NewButton("Padded Button", func() {})
padded := container.NewPadded(btn)
w.SetContent(padded)
w.ShowAndRun()
}
11. Stacked
Stacked
:堆叠布局,将控件堆叠在一起,通常用于创建重叠效果。
import (
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
func main() {
a := app.New()
w := a.NewWindow("Stacked Example")
btn1 := widget.NewButton("Button 1", func() {})
btn2 := widget.NewButton("Button 2", func() {})
stacked := container.NewStack(btn1, btn2)
w.SetContent(stacked)
w.ShowAndRun()
}
12. AdaptiveGrid
AdaptiveGrid
:自适应网格布局,根据窗口大小自动调整网格的行数和列数。
import (
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
func main() {
a := app.New()
w := a.NewWindow("AdaptiveGrid Example")
btn1 := widget.NewButton("Button 1", func() {})
btn2 := widget.NewButton("Button 2", func() {})
btn3 := widget.NewButton("Button 3", func() {})
btn4 := widget.NewButton("Button 4", func() {})
adaptiveGrid := container.NewAdaptiveGrid(2, btn1, btn2, btn3, btn4)
w.SetContent(adaptiveGrid)
w.ShowAndRun()
}
13. DocTabs
DocTabs
:文档选项卡布局,类似于TabContainer
,但支持关闭选项卡。
import (
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
func main() {
a := app.New()
w := a.NewWindow("DocTabs Example")
tab1 := container.NewTabItem("Tab 1", widget.NewLabel("Content of Tab 1"))
tab2 := container.NewTabItem("Tab 2", widget.NewLabel("Content of Tab 2"))
docTabs := container.NewDocTabs(tab1, tab2)
w.SetContent(docTabs)
w.ShowAndRun()
}
14. ScrollVBox
和 ScrollHBox
ScrollVBox
:垂直滚动布局,将控件从上到下排列,并支持滚动。ScrollHBox
:水平滚动布局,将控件从左到右排列,并支持滚动。
import (
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
func main() {
a := app.New()
w := a.NewWindow("ScrollVBox and ScrollHBox Example")
btn1 := widget.NewButton("Button 1", func() {})
btn2 := widget.NewButton("Button 2", func() {})
btn3 := widget.NewButton("Button 3", func() {})
scrollVBox := container.NewScroll(container.NewVBox(btn1, btn2, btn3))
scrollHBox := container.NewScroll(container.NewHBox(btn1, btn2, btn3))
w.SetContent(container.NewVBox(scrollVBox, scrollHBox))
w.ShowAndRun()
}
15. SplitV
和 SplitH
SplitV
:垂直分割布局,将窗口垂直分割为多个部分。SplitH
:水平分割布局,将窗口水平分割为多个部分。
import (
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
func main() {
a := app.New()
w := a.NewWindow("SplitV and SplitH Example")
top := widget.NewLabel("Top Panel")
bottom := widget.NewLabel("Bottom Panel")
left := widget.NewLabel("Left Panel")
right := widget.NewLabel("Right Panel")
splitV := container.NewVSplit(top, bottom)
splitH := container.NewHSplit(left, right)
w.SetContent(container.NewVBox(splitV, splitH))
w.ShowAndRun()
}
16. GridWrap
GridWrap
:网格包裹布局,将控件排列在网格中,并根据窗口大小自动调整网格的行数和列数。
import (
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
func main() {
a := app.New()
w := a.NewWindow("GridWrap Example")
btn1 := widget.NewButton("Button 1", func() {})
btn2 := widget.NewButton("Button 2", func() {})
btn3 := widget.NewButton("Button 3", func() {})
btn4 := widget.NewButton("Button 4", func() {})
gridWrap := container.NewGridWrap(fyne.NewSize(100, 50), btn1, btn2, btn3, btn4)
w.SetContent(gridWrap)
w.ShowAndRun()
}
17. ScrollGrid
ScrollGrid
:滚动网格布局,将控件排列在网格中,并支持滚动。
import (
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
func main() {
a := app.New()
w := a.NewWindow("ScrollGrid Example")
btn1 := widget.NewButton("Button 1", func() {})
btn2 := widget.NewButton("Button 2", func() {})
btn3 := widget.NewButton("Button 3", func() {})
btn4 := widget.NewButton("Button 4", func() {})
scrollGrid := container.NewScroll(container.NewGridWrap(fyne.NewSize(100, 50), btn1, btn2, btn3, btn4))
w.SetContent(scrollGrid)
w.ShowAndRun()
}
18. ScrollV
和 ScrollH
ScrollV
:垂直滚动布局,将控件从上到下排列,并支持滚动。ScrollH
:水平滚动布局,将控件从左到右排列,并支持滚动。
import (
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
func main() {
a := app.New()
w := a.NewWindow("ScrollV and ScrollH Example")
btn1 := widget.NewButton("Button 1", func() {})
btn2 := widget.NewButton("Button 2", func() {})
btn3 := widget.NewButton("Button 3", func() {})
scrollV := container.NewScroll(container.NewVBox(btn1, btn2, btn3))
scrollH := container.NewScroll(container.NewHBox(btn1, btn2, btn3))
w.SetContent(container.NewVBox(scrollV, scrollH))
w.ShowAndRun()
}
19. ScrollGridWrap
ScrollGridWrap
:滚动网格包裹布局,将控件排列在网格中,并根据窗口大小自动调整网格的行数和列数,并支持滚动。
import (
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
func main() {
a := app.New()
w := a.NewWindow("ScrollGridWrap Example")
btn1 := widget.NewButton("Button 1", func() {})
btn2 := widget.NewButton("Button 2", func() {})
btn3 := widget.NewButton("Button 3", func() {})
btn4 := widget.NewButton("Button 4", func() {})
scrollGridWrap := container.NewScroll(container.NewGridWrap(fyne.NewSize(100, 50), btn1, btn2, btn3, btn4))
w.SetContent(scrollGridWrap)
w.ShowAndRun()
}
20. ScrollVBox
和 ScrollHBox
ScrollVBox
:垂直滚动布局,将控件从上到下排列,并支持滚动。ScrollHBox
:水平滚动布局,将控件从左到右排列,并支持滚动。
import (
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
func main() {
a := app.New()
w := a.NewWindow("ScrollVBox and ScrollHBox Example")
btn1 := widget.NewButton("Button 1", func() {})
btn2 := widget.NewButton("Button 2", func() {})
btn3 := widget.NewButton("Button 3", func() {})
scrollVBox := container.NewScroll(container.NewVBox(btn1, btn2, btn3))
scrollHBox := container.NewScroll(container.NewHBox(btn1, btn2, btn3))
w.SetContent(container.NewVBox(scrollVBox, scrollHBox))
w.ShowAndRun()
}
21. ScrollGrid
ScrollGrid
:滚动网格布局,将控件排列在网格中,并支持滚动。
import (
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
func main() {
a := app.New()
w := a.NewWindow("ScrollGrid Example")
btn1 := widget.NewButton("Button 1", func() {})
btn2 := widget.NewButton("Button 2", func() {})
btn3 := widget.NewButton("Button 3", func() {})
btn4 := widget.NewButton("Button 4", func() {})
scrollGrid := container.NewScroll(container.NewGridWrap(fyne.NewSize(100, 50), btn1, btn2