要自定义JComboBox
中为任意对象显示的文字,我知道正确的方法是创建自定义ListCellRenderer
。但是,我不确定如何以与正常组合框模仿相同外观的方式执行此操作。
考虑下面的SSCCE。它有效,但它有一条令人不愉快的线,我将一个组件转换为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;
}
}
}
答案 0 :(得分:1)
如果您想避免强制转换,为什么不让自定义ListCellRenderer以与DefaultListCellRenderer相同的方式扩展JLabel。
请参阅示例here。