Создать ListCellRenderer, который выглядит как по умолчанию?

Чтобы настроить текст, отображаемый в 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;
    }
  }    
}

1 ответ

Если вы хотите избежать приведения, почему бы не использовать свой собственный ListCellRenderer, расширяющий JLabel так же, как это делает DefaultListCellRenderer.

Смотрите пример здесь.

Другие вопросы по тегам