2017-02-14 24 views
0

У меня есть класс DAOImplementation с определением метода ниже.Невозможно установить экземпляр объекта как выделенный элемент JComboBox с Renderer

@Override 
    public Registration getRegistrationInfoById(int aRegistrationId) { 
     String SQL = "{CALL getRegistrationInfoById(?)}"; 
     Registration aRegistration = new Registration(); 
     try (Connection con = DBUtil.getConnection(DBType.MYSQL); 
       CallableStatement cs = con.prepareCall(SQL);) { 
      cs.setInt(1, aRegistrationId); 
      try (ResultSet rs = cs.executeQuery();) { 
       while (rs.next()) { 

        int gradeLevel = Integer.parseInt(rs.getString(RegistrationTable.GRADELEVEL)); 
        aRegistration.setGradeLevel(gradeLevel); 
       } 
      } 
     } catch (SQLException e) { 
      JOptionPane.showMessageDialog(null, e.getErrorCode() + "\n" + e.getMessage()); 
     } 
     return aRegistration; 

    }//end of method 

Это возвращает целое значение уровня Grade (бл.1,2,3,4,5,6,7 ... так далее ...), которые я проверить, потому что я пытался печатать на выходе возвращается по aRegistration.getGradeLevel();

Теперь моя проблема с моим JComboBox. Я поставил ListCellRenderer для моего JComboBox который держит все GradeLevel значения

public class JComboBoxRenderer_GradeLevel extends JLabel implements ListCellRenderer<Object> { 

    public JComboBoxRenderer_GradeLevel() { 
     this.setOpaque(true); 
    } 

    @Override 
    public Component getListCellRendererComponent(JList<? extends Object> list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 
     if (value instanceof GradeLevel) { 
      this.setText("" + ((GradeLevel) value).getGradelevel()); 
     } else { 
      this.setText("--"); 
     } 

     if (isSelected) { 
      this.setBackground(Color.YELLOW); 
      this.setForeground(list.getSelectionForeground()); 
     } else { 
      this.setBackground(list.getBackground()); 
      this.setForeground(list.getForeground()); 
     } 
     return this; 
    } 
} 

И выглядит так JComboBox, как и ожидалось. (GradeLevel модель визуализируется, чтобы просто показать значение int класса level), ((GradeLevel) value).getGradelevel()); возвращает целочисленное значение.

enter image description here

Я понимаю, что даже тогда, когда JComboBox имеет средство визуализации, которое отображает целое значение GradeLevel с помощью ((GradeLevel)value).getGradeLevel(), фактическое значение на JComboBox по-прежнему рассматривается как экземпляр GradeLevel или объекта. Но не String или int.

Так что моя проблема в том, что когда я пытаюсь установить выбранное значение в значение int, оно не изменит выбранное значение JComboBox. Ничего не происходит, когда я использую setSelectedItem();

Это то, что я пытался сделать для графического интерфейса.

//Grade Level 
    GradeLevelDaoImpl gldi = new GradeLevelDaoImpl(); 
    List<GradeLevel> gradeLevels = gldi.getAllGradeLevelsInfo(); 
    DefaultComboBoxModel gradeLevelModel = new DefaultComboBoxModel(gradeLevels.toArray()); 
    jcmbGradeLevel.setModel(gradeLevelModel); 
    jcmbGradeLevel.setRenderer(new JComboBoxRenderer_GradeLevel()); 
    jcmbGradeLevel.setSelectedIndex(-1); 

GradeLevel gradeLevel = new GradeLevel(); 
gradeLevel.setGradelevel(registration.getGradeLevel()); 
jcmbGradeLevel.setSelectedItem(gradeLevel); //PROBLEM HERE, it doesn't change 

JOptionPane отображает это.

JOptionPane.showMessageDialog(null,"GradeLevel: "+gradeLevel); 

enter image description here

JOptionPane.showMessageDialog(null,"GradeLevel: "+gradeLevel.getGradeLevel()); 

enter image description here

Это не похоже, чтобы быть в состоянии сравнить объект, который я пытаюсь установить его (gradeLevel) с объектами JComboBox имеет (gradeLevels). Обратите внимание на единственное и множественное число.

Как манипулировать типов так, что setSelectedItem() будет соответствовать с тем, что JComboBox есть?

Спасибо.

+1

Если вы хотите, чтобы сделать эту работу с помощью объектов, вам необходимо переопределить ('регистрации класса, ')' equals' и 'hashcode', так что любой объект с' gradeLevel' '1' будет таким же и так далее и т. д. – MadProgrammer

+0

@MadProgrammer Я попытался сделать быстрый google на равных и переопределить hashcode. Итак, как я получаю это, мне нужно только сделать это в классе регистрации? : D Правильно? Все еще читаю информацию, которую я искал. Не слышал об этом раньше. – p3ace

+0

@ p3ace, 'Мне нужно только это сделать в классе регистрации?' - вы реализуете эти методы в классе Object, который вы добавляете в поле со списком. Если ваш рендер ожидает объекты GradeLevel, то это говорит мне, что вы должны внедрять эти методы в классе GradeLevel. – camickr

ответ

1

Если вы хотите сделать это, используя разные экземпляры объекта, но с теми же свойствами, вам необходимо переопределить методы класса equals и hashcode, так что комбинация свойств уникальна.Это очень важно, это отношения, ожидание того, что любой объект, который equal к другому будет иметь тот же hashcode

Это действительно быстрый пример, и я с помощью процесса автоматической генерации среды IDE (потому что я ленивый), но , если ваш Registration класс имеет другие свойства, которые следует учитывать при сравнении с экземплярами класса, вам нужно будет изменить его, чтобы поддержать их (опять же, любой хороший IDE должен быть в состоянии сделать это)

public class Registration { 
    private int gradeLevel; 

    public Registration(int gradeLevel) { 
     this.gradeLevel = gradeLevel; 
    } 


    public int getGradeLevel() { 
     return gradeLevel; 
    } 

    public void setGradeLevel(int gradeLevel) { 
     this.gradeLevel = gradeLevel; 
    } 

    @Override 
    public int hashCode() { 
     int hash = 7; 
     hash = 73 * hash + this.gradeLevel; 
     return hash; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) { 
      return true; 
     } 
     if (obj == null) { 
      return false; 
     } 
     if (getClass() != obj.getClass()) { 
      return false; 
     } 
     final Registration other = (Registration) obj; 
     if (this.gradeLevel != other.gradeLevel) { 
      return false; 
     } 
     return true; 
    } 


} 

Тогда используя что-то вроде ...

Registration a = new Registration(1); 
Registration b = new Registration(1); 
Registration c = new Registration(2); 

System.out.println(a.equals(b)); 
System.out.println(a.equals(c)); 
System.out.println(b.equals(c)); 

напечатает ...

true 
false 
false 

, который показывает нам, что код работает.

После того, как вы получите эту настройку, вы должны затем изменить выбранный элемент, создав экземпляр Registration, засеяв его необходимыми свойствами и передав его в JComboBox.

Это очень важно и очень распространенное понятие, используемое много в Java, также стоит потратить время, чтобы узнать и понять

+0

Я все еще работаю над поглощением информации. Вероятно, мне потребуется время для поглощения. Послушайте ваш совет, узнаете об этом. Я ценю этот пример. Примеры всегда помогают мне легче понять новые концепции. Благодарю. – p3ace

 Смежные вопросы

  • Нет связанных вопросов^_^