At lunch yesterday, one of my ex-colleagues was telling me that he couldn't quite get cascading lists to work when using Groovy's SwingBuilder.
So I knocked up an example for him:
Mum told me that it is good to share my toys, so:
import groovy.swing.*
import javax.swing.*
def swing = new SwingBuilder()
def masterData = [en: ['Hello, World!', 'How are you?'], es: ['Hola Mundo!', "Como Esta?"], can: ['Foon Ying!', 'Lei Ho Ma?']]
def detailModel = new DefaultListModel()
swing.actions() {
action(id: 'masterAction',
name: 'masterAction',
closure: {e->
def l = e.source
if (!e.valueIsAdjusting) {
def i = l.selectedValue
detailModel.clear()
masterData[i].each {
detailModel.addElement(it)
}
}
})
}
swing.frame(title: 'My Frame', pack: true, visible: true,
defaultCloseOperation: javax.swing.WindowConstants.EXIT_ON_CLOSE) {
panel() {
tableLayout() {
tr {
td {
scrollPane() {
list(valueChanged: masterAction.closure, visibleRowCount: 3, listData: masterData.collect {k, v -> k })
}
}
td {
scrollPane() {
list(visibleRowCount: 3, model: detailModel)
}
}
}
}
}
}
It may not be optimal, but it works.
There's one or two little 'gotchas' here.
First: having to pass 'masterAction.closure' directly to the first list seems wrong…elsewhere when using SwingBuilder one would just have to use 'masterAction' so this feels a little 'off' to me.
Second: the code shown works fine when run under Groovy 1.6.4 via IntelliJ Maia EAP 10666. When run directly in 1.6.4′s GroovyConsole, it gives an error:
Exception thrown: Cannot cast object '[en, es, can]' with class 'java.util.ArrayList' to class 'java.util.Vector' org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object '[en, es, can]' with class 'java.util.ArrayList' to class 'java.util.Vector'
The workaround is to use:
list(..., listData: masterData.collect {k, v -> k } as Object[])
This is probably more 'correct' according to the API, anyway.
Still, something feels 'off' here…why the different behaviors?
These are minor niggles, however.
It's still a clean and clear solution.
Gotta love that TableLayout, as well.
[edit]
There was something a bit off, but it should be sorted by now.



