groovy swingbuilder可绑定列表和表

时间:2010-02-18 04:05:39

标签: data-binding groovy swingbuilder

有没有办法使用groovy swing builder绑定语法将数据绑定到列表和/或表?我只能找到将字符串和数字等简单属性绑定到文本字段,标签或按钮文本的简单示例。

3 个答案:

答案 0 :(得分:2)

看了一眼,我能看到的最好的是使用GlazedLists而不是标准的Swing列表

http://www.jroller.com/aalmiray/entry/glazedlists_groovy_not_your_regular

答案 1 :(得分:1)

有一个GlazedList pluginthis article非常有用。格里芬家伙向GlazedLists发誓。

答案 2 :(得分:0)

我刚刚做了类似的事情 - 手动做起来并不难。它仍然是一项正在进行中的工作,但如果它可以帮助任何人,我可以给予我所拥有的。到目前为止,它在两个方向上绑定数据(更新数据更新组件,编辑表更新数据并向" Row")的任何propertyChangeListeners发送通知

我用一个类来定义一行表。您可以创建此类来定义表的性质。它看起来像这样:

class Row
{
    // allows the table to listen for changes and user code to see when the table is edited
    @Bindable
    // The name at the top of the column
    @PropName("Col 1")
    String c1
    @Bindable
    // In the annotation I set the default editable to "false", here I'll make c2 editable.
    // This annotation can (and should) be expanded to define more column properties.
    @PropName(value="Col 2", editable=true)
    String c2
}

请注意,一旦其余的代码打包在一个类中,这个" Row" class是创建新表时唯一需要创建的东西。您为每一行创建此类的实例,将它们添加到表中并完成 - 除了将表格放入框架之外,没有其他工作。

这个类可能包含更多代码 - 我打算让它包含一个轮询数据库并更新绑定属性的线程,然后表应该立即获取更改。

为了提供自定义列属性,我定义了一个看起来像这样的注释(我计划添加更多):

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface PropName {
    String value();
    boolean editable() default false
}

其余的是构建表的类。我将它保存在一个单独的类中,以便可以重复使用(通过使用不同的" Row"类实例化它)

注意:我粘贴它时粘贴它,因此它可能无法在没有一点工作的情况下运行(可能是大括号)。它曾经包含一个框架,我删除它只包括表格。您需要将getTable()返回的表包装在一个框架中。

public class AutoTable<T>
{   
    SwingBuilder builder // This way external code can access the table
    def values=[] // holds the "Row" objects
    PropertyChangeListener listener={repaint()} as PropertyChangeListener

    def AutoTable(Class<T> clazz)
    {
      builder = new SwingBuilder()
      builder.build{
        table(id:'table') {
          tableModel(id:'tableModel') {
            clazz.declaredFields.findAll{ 
              it.declaredAnnotations*.annotationType().contains(PropName.class)}.each {
                def annotation=it.declaredAnnotations.find{it.annotationType()==PropName.class 
              }
              String n=annotation.value()
              propertyColumn(header:n, propertyName:it.name, editable:annotation.editable())
            }
          }
          tableModel.rowsModel.value=values
        }
    }
    // Use this to get the table so it can be inserted into a container
    def getTable() {
        return builder.table
    }

    def add(T o) {
        values.add(o)
        o.addPropertyChangeListener(listener)
    }

    def remove(T o) {
        o.removePropertyChangeListener(listener)
        values.remove(o)
    }

    def repaint() {
        builder.doLater{
            builder.table.repaint();
        }
    }   
}

可能有一种方法可以在没有添加/删除的情况下通过公开可绑定列表来执行此操作,但似乎更多的工作没有很多好处。

在某些时候,我可能会把完成的课程放到某个地方 - 如果你已经阅读了这篇文章并且仍然感兴趣,请回复评论,我一定要尽快完成。