Переопределите метод toString JList с помощью метакласса Groovy для расширения, чтобы отобразить экземпляры классов 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, я использую следующий код для заполнения этой таблицы:

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 и, как и ожидалось, отображает свойство nombre, вызывающее метод toString(). Я делаю это, потому что считаю удобным получать второй столбец этой таблицы всякий раз, когда я получаю другие свойства объекта.

Теперь в другом пользовательском интерфейсе я хотел бы отобразить этих учителей в JList, но в другом формате. Вот где начинается метакласс. В этом другом интерфейсе я бы хотел переопределить toString() в моем классе Docente. Итак, для этого я использую следующее:

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. Когда код достигает строки println it.toString(), он использует переопределенную toString() и выводит "no entiendo" в выходной поток по умолчанию. Однако, когда я смотрю на JList, отображается оригинальный toString(). Что мне здесь не хватает?

Любые советы приветствуются.

Спасибо,

Эдуардо.

1 ответ

Решение

Моя ставка: JList не пройдет через метакласс. Как насчет украшения вашей модели?

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

def docentes = DocenteDespachador.obtenerDocentes()
docentes.each {
  model.addElement new DocenteForJList(docente:it)
}
Другие вопросы по тегам