You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Golang/Fyne:如何检测窗口与画布的(重新)大小变化

Fyne图形应用Resize问题解决方案

Fyne完全适合开发曲线绘制这类图形应用,你的问题可以通过以下方式解决:

1. 捕获窗口/组件Resize事件

方法一:给NewWithoutLayout容器绑定尺寸变化回调

直接给你创建的无布局容器设置OnSizeChanged回调,就能捕获尺寸变化:

customContainer := container.NewWithoutLayout(yourDrawObjects...)
customContainer.SetOnSizeChanged(func(newSize fyne.Size) {
    // 在这里处理尺寸变化逻辑,比如触发重绘
    customContainer.Refresh()
})

方法二:自定义Widget(更推荐)

实现自定义Widget可以更灵活地控制生命周期,重写Resize方法即可处理尺寸变化:

type SinWaveWidget struct {
    widget.BaseWidget
}

// 重写Resize方法,捕获尺寸变化
func (w *SinWaveWidget) Resize(size fyne.Size) {
    w.BaseWidget.Resize(size)
    // 更新绘制相关参数,比如曲线的范围、步长
    w.Refresh() // 触发重绘
}

// 实现CreateRenderer完成绘制逻辑
func (w *SinWaveWidget) CreateRenderer() fyne.WidgetRenderer {
    return &sinWaveRenderer{widget: w}
}

type sinWaveRenderer struct {
    widget *SinWaveWidget
}

func (r *sinWaveRenderer) Paint(canvas fyne.CanvasObject, g fyne.Canvas) {
    // 这里用r.widget.Size()获取当前实际尺寸,绘制正弦波
    size := r.widget.Size()
    // 你的绘制逻辑...
}

// 实现Renderer的其他必要方法(Layout、Destroy、Objects)

2. 解决尺寸始终返回{1,1}的问题

出现这个问题是因为你调用Size()的时机不对:

  • 初始化阶段组件还未完成布局,返回的是默认最小尺寸(1x1)。
  • 正确的做法是在尺寸变化回调或自定义Widget的Resize/Refresh/Paint方法中调用Size(),此时获取到的是布局后的实际尺寸。
  • 另外,确保你的容器/Widget被添加到能自动填充窗口的布局中,比如用container.NewMax(customContainer)包裹后设置为窗口内容,这样它会随窗口大小自动调整。

内容的提问来源于stack exchange,提问作者Ardjay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 17:40:08