如何在构建面板后动态地将按钮组添加到面板

时间:2012-12-15 16:27:42

标签: groovy swingbuilder

我正在使用Groovy Swingbuilder,我想在构建初始面板后动态填充一个单选按钮 - buttongroup。示例:我有一个面板,有几个选项。根据选择的选项,我需要用一组单选按钮填充按钮组。每个选项的无线电选项都不同。

我的小组看起来像这样:

panel(id:"chooseClass", visible:true, layout: new BL()){
             vbox(constraints: BL.CENTER){
                 label("Player Statistics", horizontalAlignment: 0)
                 label(id: 'raceLabel', text: raceLabelText, horizontalAlignment: 0)
                 label(id: 'statLabel', text: statLabelText, horizontalAlignment: 0)
                 panel(id:'classGroupPanel', layout: new GridLayout(1,9)){
                    myButtonGroup = buttonGroup(id:'classGroup')
                 }
             }
         }

然后在我的代码中我有这个方法:

def void setClassGroup(){
    def classButtons = plyGen.getAvailibleClass()
    // this is one way I've tried it
            gPane.edt{panel(id:'classGroupPanel', layout: new GridLayout(1,9)){
        buttonGroup(id:'classGroup').with{ group ->
            classButtonGroup.each{ radioButton(id: '${it.name}', CreateRadio("${it.name}"), mnemonic:"${it.mnenomic}", buttonGroup: group)}}
     }
    }
            // and this is another way I've tried it
    gPane.doOutside {
        this.classGroupPanel{ 
        buttonGroup(id:'classGroup').with{group ->
            classButtons.each{ gPane.radioButton(id: '${it.name}', CreateRadio("${it.name}"), mnemonic:"${it.mnenomic}", buttonGroup: myButtonGroup) }
            }   

        }
    }               


}

这两个尝试都编译运行没有错误,但我没有得到单选按钮列表。我希望有更多关于swingbuilder的文档。

1 个答案:

答案 0 :(得分:3)

缺少panel.revalidate()?这个人显示一个单选按钮组,其中包含一些基于您选择的乐队的歌曲。歌曲呈现为单选按钮:

import groovy.swing.*
import javax.swing.*
import java.awt.*
import java.awt.BorderLayout as BL

def drawSongsPanel(songs) {
  def p
  new SwingBuilder().edt {
    p = panel(visible: true) {
      vbox(constraints: BL.CENTER) {
        buttonGroup().with { btn ->
          songs.each { 
            radioButton text:it, buttonGroup: btn
          }
        }
      }
    }
  }
  p
}


def getSongs(band) {
  switch ( band ) {
    case "stones": return ['start me up', 'jumpin jack flash', 'satisfaction']
    case "beatles": return ['hey jude', 'yellow submarine', 'yesterday']
  }
}


def chooseBand(event, panelBands) {
  panelBands.add drawSongsPanel(getSongs(event.actionCommand))
  panelBands.revalidate()
}


new SwingBuilder().edt {
  frame(defaultCloseOperation: JFrame.EXIT_ON_CLOSE, visible: true, size: [600,500]) {
    panel( visible: true, layout: new BL() ) {
      vbox(constraints: BL.CENTER){
        def panelBands
        panelBands = panel(id:'classGroupPanel', layout: new GridLayout(1,9)) {
          buttonGroup(id: 'classGroup').with { 
            radioButton text:"beatles", buttonGroup: it, actionPerformed:{e->chooseBand(e, panelBands)}
            radioButton text:"stones", buttonGroup: it, actionPerformed:{e->chooseBand(e, panelBands)}
          }
        }
      }
    }
  }
}