2013-07-10 1 views
0

Вот код пользовательского визуализатора:ListCellRenderer литье исключение

private class FacilityElement extends javax.swing.JLabel implements javax.swing.ListCellRenderer { 

    @Override 
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 
     if(isSelected) { 
      setBackground(list.getSelectionBackground()); 
      setForeground(list.getSelectionForeground()); 
     } 
     else { 
      setBackground(list.getBackground()); 
      setForeground(list.getForeground()); 
     } 
     setFont(list.getFont()); 
     setText(" " + ((Facility) value).getName()); // The error is here 
     setOpaque(true); 

     return this; 
    } 

} 

Все прекрасно работает, за исключением, когда нет никаких элементов в DefaultComboBoxModel, в этом случае getListCellRendererComponent вызывается с String значением "", что приводит к тому, потому что он ожидает объект Facility.

Почему он ведет себя так?

Update: Я знаю, что ошибка происходит из-за кастинга, и я знаю, как использовать instance of, возникает вопрос, почему он ведет себя таким образом (функция), если нет элементов, я бы ожидать, что она не называться вообще, но почему это называется? В конце концов, что он форматирует, если нет элементов.

Обновление: Принятый ниже ответ можно использовать. Что касается того, почему он ведет себя так, это потому, что в списке должна быть пустая строка; вы знаете пустую строку, которая выбрана по умолчанию при инициализации combobox в первый раз.

+0

1) Для лучшей помощи раньше, отправьте сообщение [SSCCE] (http://sscce.org/). 2) Всегда копировать/вставлять вывод ошибок и исключений. –

+0

downcasting dangereous, use 'instanceof' – nachokk

+0

никогда не устанавливать значение для компонента рендеринга внутри XxxRenderer – mKorbel

ответ

2
private class FacilityElement extends javax.swing.JLabel implements javax.swing.ListCellRenderer { 

    @Override 
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 
     if(isSelected) { 
      setBackground(list.getSelectionBackground()); 
      setForeground(list.getSelectionForeground()); 
     } 
     else { 
      setBackground(list.getBackground()); 
      setForeground(list.getForeground()); 
     } 
     setFont(list.getFont()); 
     if (value instanceof Facility) { // Try this 
      setText(" " + ((Facility) value).getName()); 
     }  
     setOpaque(true); 

     return this; 
    } 

} 
+0

Пожалуйста, используйте форматирование кода для кода, ввода/вывода и структурированных документов, таких как HTML или XML. Для этого выберите образец и нажмите кнопку '{}' над формой отправки сообщений/редактирования. –