У меня есть класс 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());
возвращает целочисленное значение.
Я понимаю, что даже тогда, когда 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);
JOptionPane.showMessageDialog(null,"GradeLevel: "+gradeLevel.getGradeLevel());
Это не похоже, чтобы быть в состоянии сравнить объект, который я пытаюсь установить его (gradeLevel
) с объектами JComboBox
имеет (gradeLevels
). Обратите внимание на единственное и множественное число.
Как манипулировать типов так, что setSelectedItem()
будет соответствовать с тем, что JComboBox
есть?
Спасибо.
Если вы хотите, чтобы сделать эту работу с помощью объектов, вам необходимо переопределить ('регистрации класса, ')' equals' и 'hashcode', так что любой объект с' gradeLevel' '1' будет таким же и так далее и т. д. – MadProgrammer
@MadProgrammer Я попытался сделать быстрый google на равных и переопределить hashcode. Итак, как я получаю это, мне нужно только сделать это в классе регистрации? : D Правильно? Все еще читаю информацию, которую я искал. Не слышал об этом раньше. – p3ace
@ p3ace, 'Мне нужно только это сделать в классе регистрации?' - вы реализуете эти методы в классе Object, который вы добавляете в поле со списком. Если ваш рендер ожидает объекты GradeLevel, то это говорит мне, что вы должны внедрять эти методы в классе GradeLevel. – camickr