1

要为任意对象自定义在 a 中显示的文本,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;
    }
  }    
}
4

1 回答 1

1

如果您想避免强制转换,为什么不让您的自定义 ListCellRenderer 以与 DefaultListCellRenderer 相同的方式扩展 JLabel。

请参阅此处的示例。

于 2013-09-19T20:42:58.497 回答