Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Data binding groovy swingbuilder可绑定列表和表_Data Binding_Groovy_Swingbuilder - Fatal编程技术网

Data binding groovy swingbuilder可绑定列表和表

Data binding groovy swingbuilder可绑定列表和表,data-binding,groovy,swingbuilder,Data Binding,Groovy,Swingbuilder,有没有办法使用groovy swing builder绑定语法将数据绑定到列表和/或表?我只能找到将字符串和数字等简单属性绑定到文本字段、标签或按钮文本的简单示例。查看了一下,我能看到的最好结果是使用glazedList而不是标准的Swing列表 有一个问题。这很有帮助。狮鹫队的人对格拉泽德主义者发誓。我只是做了这样的事情——手工操作真的没那么难。这仍然是一项正在进行的工作,但如果它对任何人都有帮助,我可以付出我所拥有的。到目前为止,它在两个方向上绑定数据(更新数据更新组件,编辑表更新数据,并向

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

查看了一下,我能看到的最好结果是使用glazedList而不是标准的Swing列表


有一个问题。这很有帮助。狮鹫队的人对格拉泽德主义者发誓。

我只是做了这样的事情——手工操作真的没那么难。这仍然是一项正在进行的工作,但如果它对任何人都有帮助,我可以付出我所拥有的。到目前为止,它在两个方向上绑定数据(更新数据更新组件,编辑表更新数据,并向“行”的任何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”类就是创建新表所需的唯一对象。您为每一行创建这个类的实例,将它们添加到表中,就完成了——除了将表放入框架之外,没有其他gui工作

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

为了提供自定义列属性,我定义了如下注释(我计划添加更多):

其余的是一个构建表的类。我将其保存在一个单独的类中,以便可以重用(通过使用不同的“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();
        }
    }   
}
公共类自动表
{   
SwingBuilder//这样外部代码就可以访问表了
def values=[]//保存“行”对象
PropertyChangeListener侦听器={repaint()}作为PropertyChangeListener
def自动表(clazz类)
{
builder=新SwingBuilder()
建筑商{
表(id:“表”){
tableModel(id:'tableModel'){
clazz.declaredFields.findAll{
it.declaredAnnotations*.annotationType()包含(PropName.class)}。每个{
def annotation=it.declaredAnnotations.find{it.annotationType()==PropName.class
}
字符串n=注释。值()
propertyColumn(标题:n,propertyName:it.name,可编辑:annotation.editable())
}
}
tableModel.rowsModel.value=值
}
}
//使用此选项获取表格,以便将其插入到容器中
def getTable(){
返回生成器表
}
def添加(TO){
值。添加(o)
o、 addPropertyChangeListener(侦听器)
}
def拆卸(TO){
o、 removePropertyChangeListener(侦听器)
值。删除(o)
}
def重新绘制(){
杜拉特先生{
builder.table.repaint();
}
}   
}
可能有一种方法可以在不添加/删除的情况下通过公开一个可绑定列表来实现这一点,但这似乎是一种没有很多好处的工作


在某个时候,我可能会把完成的课程放在某个地方——如果你已经读了这么多,并且仍然感兴趣,请回复一条评论,我肯定会尽快回复。

是的,我看到了,谢谢。在接受之前,我会等着看其他人是否有回应,谢谢。也许我找到了一些东西给你看看《加油》s
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();
        }
    }   
}