문제

Jlistbox 스윙 구성 요소의 .NET "Set DisplayMember"와 비슷한 메커니즘이 있습니까?

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

}

클라이언트 GUI 코드에서 다음과 같은 작업을 수행 할 수 있습니다.

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