如果你把numPanels作为一个固定的值,例如20,这真的是一个很好的和groovy的变化。
但是我尝试了两天,用groovy.swing.Spinner动态地添加或多或少的面板(我的程序将用于连接到不同的数据库并从不同的db-tables交换值)。我尝试了绑定,重新验证,重新绘制-但我不能使闭包从旋转器中获取新值…
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编程方面有所提高吗?我很乐意用我的程序开始一个基于礼物的"工程"。这个程序将比较用户给定的列表数量与文章来自一个或多个数据库或excel文件,保存他们和每一个结果在PostgreSQL或MSSQL。每个列表可以有零个、一个或多个条目,通过它们的条目编号来识别,每个实体中有不同的数量。用户可以在GUI的引导下决定以何种顺序添加或减去另一个实体。除了article-number和amount之外的其他属性(0到无穷大)将贯穿列表。不太复杂,但对于第一个项目…