جافا سوينغ: مجموعة الأعضاء التي يتم عرضها في JListBox

StackOverflow https://stackoverflow.com/questions/2253222

سؤال

هل هناك آلية مماثلة ل. NET "مجموعة DisplayMember" للمكون JListBox سوينغ؟

وغلبة طريقة toString() ليس كافيا لأنني أريد أيضا أن تكون قادرة على تغيير عضوا عرض في وقت التشغيل.

وكنت قد بحثت أيضا في تنفيذ بلدي ListCellRenderer الخاصة، ولكن وجدت أنه لا مريحة للغاية.

والمحكمة الخاصة العراقية هناك نهج أسهل أو أكثر أناقة؟

وشكرا على وقتك.

هل كانت مفيدة؟

المحلول 2

وخطرت لي الى حل يرضى على أساس تنفيذ ListCellRenderer المخصصة.

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

}

في كود واجهة المستخدم الرسومية العميل الخاص بك يمكنك أن تفعل شيئا من هذا القبيل:

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

نصائح أخرى

ويجب عليك إنشاء فئة التفاف حول الكائن عملك أن يتجاوز toString (). وبهذه الطريقة يمكنك الاحتفاظ الكائن الخاص بك نظيفة ويمكن في مغلفة مبادلة وقت التشغيل.

public class MyWrapper()
{
    private MyBusinessObject object;

    public String toString()
    {
        return object.getImportantString();
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top