Question

Y at-il un mécanisme comparable au .NET "set DisplayMember" pour le composant Swing JListBox?

Redéfinition de la méthode toString() ne suffit pas parce que je veux aussi être en mesure de changer l'élément d'affichage lors de l'exécution.

Je regardais aussi dans la mise en œuvre ma propre ListCellRenderer, mais il lui est pas très pratique.

Ist-il une approche plus facile ou plus élégant?

Merci pour votre temps.

Était-ce utile?

La solution 2

Je suis venu avec une solution satisfaisante fondée sur la mise en œuvre d'un ListCellRenderer personnalisé.

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;
    }

}

Dans votre code de l'interface client que vous pouvez faire quelque chose comme ceci:

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

Autres conseils

Vous devez créer une classe wrapper autour de votre objet métier qui l'emporte sur toString (). De cette façon, vous garder votre propre objet propre et peut à wrappers d'échange d'exécution.

public class MyWrapper()
{
    private MyBusinessObject object;

    public String toString()
    {
        return object.getImportantString();
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top