亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 fyne-io 中制作具有不同對象類型的表格?

如何在 fyne-io 中制作具有不同對象類型的表格?

Go
搖曳的薔薇 2023-02-06 18:52:26
我使用 fyne-io 制作用戶界面。在表格中,我想要一些帶有超鏈接的單元格和其他帶有 Label 的單元格。我試過了,但沒用:package mainimport (    "fmt"    "fyne.io/fyne"    "fyne.io/fyne/app"    "fyne.io/fyne/layout"    "fyne.io/fyne/widget")func setDefaultColumnsWidth(table *widget.Table) {    table.SetColumnWidth(0, 130)    table.SetColumnWidth(1, 150)    table.SetColumnWidth(2, 160)    table.SetColumnWidth(3, 200)    table.SetColumnWidth(4, 400)    table.SetColumnWidth(5, 150)    table.SetColumnWidth(6, 250)    table.SetColumnWidth(7, 110)    table.SetColumnWidth(8, 80)}func main() {    application := app.New()    win := application.NewWindow("Test GUI")    data := [][]string{{"ffffffffffffff", "ffffffffffffff", "ffffffffffffff", "ffffffffffffff", "ffffffffffffff", "ffffffffffffff", "ffffffffffffff"},        {"ffffffffffffff", "ffffffffffffff", "ffffffffffffff", "ffffffffffffff", "ffffffffffffff", "ffffffffffffff", "ffffffffffffff"},        {"ffffffffffffff", "ffffffffffffff", "ffffffffffffff", "ffffffffffffff", "ffffffffffffff", "ffffffffffffff", "ffffffffffffff"}}    tableData := widget.NewTable(        func() (int, int) {            return len(data), len(data[0])        },        func() fyne.CanvasObject {            label := widget.NewLabel("")            return label        },        func(i widget.TableCellID, o fyne.CanvasObject) {            switch o.(type) {            case *widget.Label:                label := o.(*widget.Label)                label.SetText(data[i.Row][i.Col])            case *widget.Hyperlink:                fmt.Println("Found Hyperlink")                hyperlink := o.(*widget.Hyperlink)                //  hyperlink.SetText(data[i.Row][i.Col])                hyperlink.SetText("aaaaaaa")            }        })}我能怎么做 ?我看到消息“fmt.Println("Found Hyperlink")”,但未顯示超鏈接。為什么 o.(type) 等于 *widget.Hyperlink 而超鏈接不顯示?
查看完整描述

3 回答

?
鳳凰求蠱

TA貢獻1825條經驗 獲得超4個贊

看來問題是標簽沒有被破壞并且與新創建的超鏈接重疊。我無法找到上述問題的解決方案,但提出了替代解決方案,因為fyne API 處于開發階段,許多內部功能無法訪問并且可能會更改解決方案可能會隨著時間的推移而更改并變得簡單化。


package main


import (

  "image/color"


  "fyne.io/fyne/v2"

  "fyne.io/fyne/v2/app"

  "fyne.io/fyne/v2/layout"

  "fyne.io/fyne/v2/widget"

  "fyne.io/fyne/v2/canvas"

)


const HEIGHT float32 = 30


func setDefaultColumnsWidth(table *widget.Table) {

  colWidths := []float32{130, 150, 160, 200, 400, 150, 250, 110, 80}

  for idx, colWidth := range colWidths {

    table.SetColumnWidth(idx, colWidth)

  }

}


func main() {


  application := app.New()

  win := application.NewWindow("Test GUI")


  data := [][]fyne.CanvasObject{

    {widget.NewLabel("ffffffffffffff"), widget.NewHyperlink("TUTU", nil), widget.NewLabel("ffffffffffffff"), widget.NewLabel("ffffffffffffff"), widget.NewLabel("ffffffffffffff"), widget.NewLabel("ffffffffffffff"), widget.NewLabel("ffffffffffffff")},

    {widget.NewLabel("ffffffffffffff"), widget.NewLabel("ffffffffffffff"), widget.NewLabel("ffffffffffffff"), widget.NewLabel("ffffffffffffff"), widget.NewLabel("ffffffffffffff"), widget.NewLabel("ffffffffffffff"), widget.NewHyperlink("ffffffffffffff", nil)},

    {widget.NewHyperlink("TUTU", nil), widget.NewLabel("ffffffffffffff"), widget.NewLabel("ffffffffffffff"), widget.NewLabel("ffffffffffffff"), widget.NewLabel("ffffffffffffff"), widget.NewLabel("ffffffffffffff"), widget.NewLabel("ffffffffffffff")},

  }


  tableData := widget.NewTable(

    func() (int, int) {

      return len(data), len(data[0])

    },

    func() fyne.CanvasObject {

      c := fyne.NewContainerWithoutLayout()

      r := canvas.NewRectangle(color.White)

      r.SetMinSize(fyne.NewSize(0, HEIGHT))

      r.Resize(fyne.NewSize(0, HEIGHT))

      c.AddObject(r)

      return c

    },

    func(cell widget.TableCellID, o fyne.CanvasObject) {

      container := o.(*fyne.Container)

      var obj fyne.CanvasObject = data[cell.Row][cell.Col]

      container.AddObject(obj)

      container.Refresh()

  })


  setDefaultColumnsWidth(tableData)


  label := widget.NewLabel("My table :")

  button := widget.NewButton("Close", func() {

    application.Quit()

  })


  container := layout.NewBorderLayout(label, button, nil, nil)

  box := fyne.NewContainerWithLayout(container, label, tableData, button)

  win.SetContent(box)


  win.Resize(fyne.NewSize(1800, 400))

  win.ShowAndRun()


}

輸出: 在此處輸入圖像描述


查看完整回答
反對 回復 2023-02-06
?
慕桂英546537

TA貢獻1848條經驗 獲得超10個贊

我聯系了 Fyne Slack 小組,推薦的解決方案是將兩個元素封裝在一個容器中,并在更新回調函數中僅顯示所需的元素


創建單元回調函數:


func() fyne.CanvasObject {

    label := widget.NewLabelWithStyle("", fyne.TextAlignLeading, fyne.TextStyle{})

    hyperlink := widget.NewHyperlink("", nil)

    hyperlink.Hide()

    return container.NewMax(label, hyperlink)

}

更新回調函數:


func(i widget.TableCellID, o fyne.CanvasObject) {


    container := o.(*fyne.Container)

    label := container.Objects[0].(*widget.Label)

    hyperlink := container.Objects[1].(*widget.Hyperlink)


    switch i.Col {

    case 0:

    case 5:

        label.Hide()

        hyperlink.Hidden = false

        hyperlink.SetText("Hi!")

        hyperlink.SetURL(url.Parse("https://stackoverflow.com"))


    default:

        hyperlink.Hide()

        label.Hidden = false

        label.SetText("Hello")

    }

}


查看完整回答
反對 回復 2023-02-06
?
喵喵時光機

TA貢獻1846條經驗 獲得超7個贊

關于如何使用container.NewMax和Table.SetColumnWidth創建更復雜的表,有更完整的文章。該示例逐步執行此表的代碼:


在此處輸入圖像描述


兩個主要技巧是設置容器而不是單個小部件:


container.NewMax(widget.NewLabel("template11"), widget.NewIcon(nil))

然后在回調中適當地隱藏或顯示項目:


l := o.(*fyne.Container).Objects[0].(*widget.Label)

i := o.(*fyne.Container).Objects[1].(*widget.Icon)

l.Show()

i.Hide()

switch id.Col {

case 2:

    l.Hide()

    i.Show()

    i.SetResource(getIcon(id.Row))

case 0:

    l.SetText("hostname")

}

在https://fynelabs.com/2022/12/30/building-complex-tables-with-fyne/閱讀更多內容


查看完整回答
反對 回復 2023-02-06
  • 3 回答
  • 0 關注
  • 369 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號