2012-07-13 38 views
1

的實例在一個常規擺動應用中,我有一個表示教師像下面的類:重寫的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()。我在這裏錯過了什麼?

任何提示表示讚賞。

感謝,

愛德華多。

回答

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) 
} 
+0

Pitty。我想知道這是否會考慮Groovy中的一個bug。我會採納這個建議。順便說一下,我很感謝@Will P. 我使用了groovy 1.8.4。 – ecavero 2012-07-16 14:51:25

+0

@ecavero,我認爲這是正確的行爲。 groovy中的每個方法調用都通過metaClass。在java中的代碼如下: 'obj.method()' 看起來像: 'obj.getMetaClass()。invokeMethod(「method」);' JList內部只會通過java代碼。從java中可以看到,當你重新定義'toString()'方法時,代碼需要重新編譯。 – Will 2012-07-18 20:30:01

+0

所以,我想你說的是,SwingBuilder創建一個Java JList對象,而不是擴展GroovyObject的JList。我對嗎? – ecavero 2012-07-25 16:20:02