Переопределите метод 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)
}