的實例在一個常規擺動應用中,我有一個表示教師像下面的類:重寫的JList toString方法與常規的expando元類來顯示Groovy類
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是常規的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()行時,它會使用覆蓋toString()並向默認輸出流顯示「no entiendo」。但是,當我查看JList時,會顯示原始的toString()。我在這裏錯過了什麼?
任何提示表示讚賞。
感謝,
愛德華多。
Pitty。我想知道這是否會考慮Groovy中的一個bug。我會採納這個建議。順便說一下,我很感謝@Will P. 我使用了groovy 1.8.4。 – ecavero 2012-07-16 14:51:25
@ecavero,我認爲這是正確的行爲。 groovy中的每個方法調用都通過metaClass。在java中的代碼如下: 'obj.method()' 看起來像: 'obj.getMetaClass()。invokeMethod(「method」);' JList內部只會通過java代碼。從java中可以看到,當你重新定義'toString()'方法時,代碼需要重新編譯。 – Will 2012-07-18 20:30:01
所以,我想你說的是,SwingBuilder創建一個Java JList對象,而不是擴展GroovyObject的JList。我對嗎? – ecavero 2012-07-25 16:20:02