Swing Groovy问题:当微调器';s stateChanged触发一个动作

Swing Groovy问题:当微调器';s stateChanged触发一个动作,swing,groovy,action,spinner,vbox,Swing,Groovy,Action,Spinner,Vbox,如果你把numPanels作为一个固定值,例如20,这真的是一个很好的、非常棒的摆动 但两天后,我尝试使用groovy.swing.Spinner动态添加更多或更少的面板(我的程序将用于连接到不同的数据库并交换来自不同db表的值)。我尝试过绑定、重新验证、重新绘制-但我无法通过关闭从微调器获取新值 import groovy.swing.SwingBuilder import javax.swing.WindowConstants as WC import javax.swing.JOption

如果你把numPanels作为一个固定值,例如20,这真的是一个很好的、非常棒的摆动

但两天后,我尝试使用groovy.swing.Spinner动态添加更多或更少的面板(我的程序将用于连接到不同的数据库并交换来自不同db表的值)。我尝试过绑定、重新验证、重新绘制-但我无法通过关闭从微调器获取新值

import groovy.swing.SwingBuilder
import javax.swing.WindowConstants as WC
import javax.swing.JOptionPane
import javax.swing.JScrollPane
import javax.swing.BoxLayout as BXL
import javax.swing.SpinnerNumberModel

int numPanels = 2

swing = new SwingBuilder()

def setPanelAmount = swing.action(name:'Amount of Panels in vbox-element',  closure: this.&setPanelAmount )

frame = swing.frame(title:'test', pack:true, visible:true, defaultCloseOperation:WC.HIDE_ON_CLOSE) {
panel(id:'mainPanel'){
scrollPane( verticalScrollBarPolicy:JScrollPane.VERTICAL_SCROLLBAR_ALWAYS ) {
  vbox {
    (1..numPanels).each { num ->
      def panelID = "panel$num"
      def pane = panel( alignmentX:0f, id:panelID, background:java.awt.Color.GREEN ) {
        label('description') 
        textField( id: "description$num", text:panelID, columns: 70 )
        button( id: "buttonpanel$num", text:panelID, actionPerformed:{
          swing."$panelID".background = java.awt.Color.RED
        } )
      }
    }
  }
}

boxLayout(axis: BXL.Y_AXIS)
panel(id:'secondPanel' , alignmentX: 0f){                       
 hbox(){
 label 'Change amount of panels:'
 hstrut(10)
  spinner(id: 'numPanelSpinner', stateChanged: this.&setPanelAmount, model: new SpinnerNumberModel(2, 2, 10, 1))
  hstrut(50)
  button('Quit', actionPerformed:{
    frame.visible = false
  })
  }
}
}       
}
frame.size = [ frame.width, 600 ]

def setPanelAmount(event) {
    numPanels = swing.numPanelSpinner.getValue()
    }

它必须与下面的代码相结合-但不幸的是,它不能与包含的闭包一起工作-至少就我现在所知

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

new SwingBuilder().edt {
  frame(defaultCloseOperation: JFrame.EXIT_ON_CLOSE, visible: true, size: [600,500]) {
   panel(id:'main') {
    panel {   
      button(name:'x', action: action(name:'add', closure:{p.add(label('new')); p.revalidate()}))
      button(action: action(name:'remove', closure:{p.removeAll();p.revalidate();scroll.repaint()}))
}

panel() {
  scrollPane(id:'scroll',preferredSize: [200,200], constraints: context.CENTER) {
    panel(id:'p') {
      checkBoxList(listData: (1..20).collect([]){"Option $it"} as Object[])
    }
  }
}
  }
 } 
}
顺便说一句:你也喜欢改进groovy编程吗? 我很乐意用我的程序开始一个基于git的“工程”。 该程序将用户给定数量的列表与来自一个或多个数据库或excel文件的文章进行比较,并将它们和每个结果保存在PostgreSQL或MSSQL中。 每个列表可能有零个、一个或多个物品,以物品编号标识,每个实体的数量不同。 用户可以在GUI的指导下决定从另一个实体中添加或减去实体的顺序。物品编号和数量旁边的其他(零到无限)属性将在列表中携带。 不太复杂,但对于第一个项目