Pregunta

¿Existe un mecanismo comparable con el .NET "set DisplayMember" para el componente JListBox oscilación?

Sustitución del método toString() no es suficiente porque yo también quiero ser capaz de cambiar el elemento de visualización en tiempo de ejecución.

También mirado en la implementación de mi propia ListCellRenderer, pero encontré que no es muy conveniente.

Ist hay un enfoque más fácil o más elegante?

Gracias por su tiempo.

¿Fue útil?

Solución 2

Se me ocurrió una solución satisfactoria basada en la implementación de un ListCellRenderer personalizado.

import java.awt.Component;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JList;
import javax.swing.ListCellRenderer;

public class DynamicCellRenderer implements ListCellRenderer {
    private final ListCellRenderer listCellRenderer;
    private String displayMember;

    public DynamicCellRenderer(String displayMember) {
        this(displayMember, new DefaultListCellRenderer());
    }

    public DynamicCellRenderer(String displayMember, ListCellRenderer wrapped) {
        listCellRenderer = wrapped;
        this.displayMember = displayMember;
    }

    @Override
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
        Object displayMemberValue = getDisplayMemberValue(value);
        return listCellRenderer.getListCellRendererComponent(list, displayMemberValue, index, isSelected, cellHasFocus);
    }

    private Object getDisplayMemberValue(Object value) {
        // value is the domain class
        // only works if display member is a method, TODO: fallback to field
        // displayMember is something like "getName" -> value.getName() gets called
        try {
            return value.getClass().getMethod(displayMember).invoke(value);
        } catch (Exception ex) {
            // if anything went wrong it is the programmers fault -> propagate exception
            throw new RuntimeException(ex);
        }
    }

    public String getDisplayMember() {
        return displayMember;
    }

    public void setDisplayMember(String displayMember) {
        this.displayMember = displayMember;
    }

}

En el código GUI del cliente que puede hacer algo como esto:

jListBox1.setCellRenderer(new DynamicCellRenderer("getName"));
...
...
// and later at some point
((DynamicCellRenderer) jListBox1.getCellRenderer()).setDisplayMember("getEmail");

Otros consejos

Usted debe crear una clase contenedora alrededor de su objeto de negocio que anula toString (). De esta manera mantener su propio objeto limpio y puede en envoltorios de intercambio de tiempo de ejecución.

public class MyWrapper()
{
    private MyBusinessObject object;

    public String toString()
    {
        return object.getImportantString();
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top