Javaのスイング:JListBoxに表示されているセット・メンバー
-
20-09-2019 - |
質問
JListBoxのSwingコンポーネントのための "DisplayMemberに設定" .NETに匹敵する仕組みがありますか?
私も、実行時に表示部材を変更することができるようにしたいので、 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