Domanda

Esiste un meccanismo paragonabile al .NET "set DisplayMember" per la componente JListBox Swing?

Come ignorare il metodo toString() non è sufficiente perché anche io voglio essere in grado di cambiare il membro del display in fase di esecuzione.

Ho anche guardato in attuazione mia ListCellRenderer, ma l'ho trovato abbastanza difficile.

Ist c'è un approccio più facile o più elegante?

Grazie per il vostro tempo.

È stato utile?

Soluzione 2

mi si avvicinò con una soluzione soddisfacente sulla base di attuazione di un ListCellRenderer personalizzato.

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

}

Nel codice GUI del client si può fare qualcosa di simile:

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

Altri suggerimenti

Si dovrebbe creare una classe wrapper per l'oggetto di business che ignora toString (). In questo modo è mantenere il proprio oggetto pulito e può in involucri di swap di esecuzione.

public class MyWrapper()
{
    private MyBusinessObject object;

    public String toString()
    {
        return object.getImportantString();
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top