任意のオブジェクトの に表示されるテキストをカスタマイズするにJComboBox
は、カスタム を作成するのが正しいアプローチであることを知っていますListCellRenderer
。ただし、通常のコンボ ボックスと同じルック アンド フィールを模倣する方法でこれを行う方法がわかりません。
以下の SSCCE を検討してください。動作しますが、コンポーネントを にキャストする不快な行が 1 つありJLabel
ます。これは私が持つべきではない、頼るべきではない魔法の知識です。そんなに醜いことをせずに同じ効果を得る他の方法はありますか?
public class ListCellRendererExample {
private final JFrame frame;
public ListCellRendererExample() {
frame = new JFrame();
JComboBox<SomeObject> combobox = new JComboBox<>(
new SomeObject[] { new SomeObject("a") });
ListCellRenderer<? super SomeObject> cellRenderer = combobox.getRenderer();
combobox.setRenderer(new CustomRenderer(cellRenderer));
frame.add(combobox);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
new ListCellRendererExample();
}
private class CustomRenderer implements ListCellRenderer<SomeObject> {
private final ListCellRenderer<? super SomeObject> defaultRenderer;
public CustomRenderer(ListCellRenderer<? super SomeObject> cellRenderer) {
this.defaultRenderer = cellRenderer;
}
@Override
public Component getListCellRendererComponent(
JList<? extends SomeObject> list, SomeObject value, int index,
boolean isSelected, boolean cellHasFocus) {
Component result = defaultRenderer.getListCellRendererComponent(list,
value, index, isSelected, cellHasFocus);
((JLabel) result).setText(value.value); // <--- URGH!
return result;
}
}
private static class SomeObject {
private final String value;
public SomeObject(String nombre) {
this.value = nombre;
}
}
}