0

numPanels を 20 などの固定値にすると、実に素晴らしくグルーヴィーなスイングになります。

しかし、2 日以来、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()
    }
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[])
    }
  }
}
  }
 } 
}

ところで、あなたもグルーヴィーなプログラミングを上達させたいですか?私のプログラムで git ベースの「エンジニアリング」を開始できれば幸いです。このプログラムは、ユーザーが指定した量のリストを 1 つ以上のデータベースまたは Excel ファイルからの記事と比較し、それらとすべての結果を PostgreSQL または MSSQL に保存します。すべてのリストには、記事番号で識別されるゼロ、1 つ、または複数の記事が含まれる場合があり、エンティティごとに金額が異なります。また、ユーザーは、GUI のガイドに従って、エンティティを別のエンティティから追加または削除する順序を決定できます。article-number と amount 以外のその他の属性 (ゼロから無限) は、リストを通じて引き継がれます。それほど複雑ではありませんが、最初のプロジェクトの場合...

于 2013-03-11T08:21:17.667 に答える