0

如果您将 numPanels 作为固定值,例如 20,那么这确实是一个很好的和时髦的摆动。

但是我从两天开始尝试动态添加或多或少的带有 groovy.swing.Spinner 的面板(我的程序将用于连接到不同的数据库并交换来自不同数据库表的值)。我尝试了绑定、重新验证、重新绘制 - 但我不能带来闭包以从微调器中获取新值......

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()
    }
4

1 回答 1

0

它必须与以下代码结合使用-但不幸的是,它不适用于包含的闭包-至少据我所知...

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[])
    }
  }
}
  }
 } 
}

BTW.:你也想改进 groovy 编程吗?我很高兴用我的程序开始一个基于 git 的“工程”。该程序会将用户给定数量的列表与来自一个或多个数据库或 excel 文件的文章进行比较,将它们和每个结果保存在 PostgreSQL 或 MSSQL 中。每个列表可能有零个、一个或多个由它们的文章编号标识的文章,每个实体中的数量不同。并且用户可以 - 在 GUI 的指导下 - 决定从另一个实体中添加或减去实体的顺序。除了文章编号和数量之外的其他(从零到无限)属性将通过列表进行。不太复杂,但对于第一个项目......

于 2013-03-11T08:21:17.667 回答