使用groovy expando元类重写JList toString方法以显示groovy类的实例

时间:2012-07-13 16:43:10

标签: groovy jlist expandometaclass

在一个时髦的摇摆应用程序中,我有一个代表以下教师的课程:

Docente.groovy

public class Docente {
    String codigo
    String nombre
    String apellidoPaterno
    String apellidoMaterno
    String direccion
    String tipoDocumento    
    String sexo
    String telefono
    String correo

    String toString() {
        nombre
    }
}

我使用toString方法在JTable中显示教师名称(带有nombre)以及某些其他值。这个想法是在桌子上显示其中一些,其余的在JDialog窗口上显示,以便执行儿子CRUD操作。

假设sw是groovy的SwingBuilder对象的实例,并且grdDocentes是JTable的id,我使用以下代码填充该表:

DocentesUI.groovy

...
def tm = sw.grdDocentes.model
tm.rowCount = 0
def doc = DocenteDespachador.obtenerDocentes()
doc.each {
    tm.addRow([it.codigo, it, it.apellidoPaterno, it.apellidoMaterno] as Object[])
}   

... 

ObtenerDocentes()是用于从数据库中获取所有教师的方法。第二列(它)是Docente实例本身,并且正如预期的那样,它显示调用toString()方法的nombre属性。我这样做,因为我发现只要获得对象的其他属性,就可以方便地获取此表的第二列。

现在,在另一个用户界面上,我想在JList中显示这些教师,但格式不同。这是metaClass的用武之地。在这个其他界面中,我想覆盖我的Docente类上的toString()。所以,为此,我使用以下内容:

AsignarDocenteUI.groovy

...
        def model = sw.lstDocentesDisponibles.model
        Docente.metaClass.toString = {
            return "No entiendo"
        }           
        def docentes = DocenteDespachador.obtenerDocentes()
        docentes.each {
            println it.toString()
            println it
            model.addElement it
        }

...

这里,lstDocentesDisponibles是JList的id。当代码到达println it.toString()行时,它使用overriden toString()并向默认输出流显示“no entiendo”。但是,当我查看JList时,会显示原始的toString()。我在这里缺少什么?

任何提示都表示赞赏。

谢谢,

爱德华。

1 个答案:

答案 0 :(得分:0)

我敢打赌:JList不会通过metaClass。装饰模型怎么样?

class DocenteForJList { 
  Docente docente
  String toString() { docente.with { "$nombre ($codigo)" } }
}

def docentes = DocenteDespachador.obtenerDocentes()
docentes.each {
  model.addElement new DocenteForJList(docente:it)
}