Java Swing : Jlistbox에 표시되는 회원 세트
-
20-09-2019 - |
문제
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();
}
}
제휴하지 않습니다 StackOverflow