Frage

Sie haben einen vergleichbaren Mechanismus auf die .NET „gesetzt Display“ für die JListBox Swing-Komponente?

die toString() Methode Aufschalten ist nicht ausreichend, weil ich auch zur Laufzeit des Anzeigeelement zu ändern, um die Lage sein soll.

Ich sehe auch in meine eigenen ListCellRenderer Umsetzung, aber fand es nicht sehr bequem.

Ist es ein einfacher oder eleganteren Ansatz?

Vielen Dank für Ihre Zeit.

War es hilfreich?

Lösung 2

kam ich mit einer befriedigenden Lösung bis basierend auf einer benutzerdefinierten ListCellRenderer implementieren.

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

}

In Ihrem Client GUI Code, den Sie so etwas tun kann:

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

Andere Tipps

Sie sollten eine Wrapper-Klasse um Ihr Business-Objekt, dass Überschreibungen toString () erstellen. So können Sie Ihr eigenes Objekt sauber und kann halten zur Laufzeit Swap-Wrapper.

public class MyWrapper()
{
    private MyBusinessObject object;

    public String toString()
    {
        return object.getImportantString();
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top