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 に教師の名前 (名詞付き) を他の特定の値と共に表示します。CRUD操作を実行するために、それらのいくつかをテーブルに表示し、残りをJDialogウィンドウに表示するというアイデアがあります。

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() は、データベースからすべての教師を取得するために使用するメソッドです。2 番目の列 (それ) は Docente インスタンス自体であり、予想どおり、toString() メソッドを呼び出す nombre プロパティが表示されます。オブジェクトの他のプロパティを取得する必要があるときはいつでも、このテーブルの 2 番目の列を取得するのが便利だと思うので、これを行います。

ここで、別のユーザー インターフェイスで、これらの教師を 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 に答える