1

在一个 groovy swing 应用程序中,我有一个代表教师的类,如下所示:

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 中显示教师姓名(带名词)以及某些其他值。想法是将其中一些显示在表格上,将其余部分显示在 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() 是用于从数据库中获取所有教师的方法。第二列 (it) 是 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() 行时,它使用覆盖的 toString() 并向默认输出流显示“no entiendo”。但是,当我查看 JList 时,会显示原始的 toString()。我在这里想念什么?

任何提示表示赞赏。

谢谢,

爱德华多。

4

1 回答 1

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)
}
于 2012-07-14T16:39:20.550 回答