Невозможно установить экземпляр объекта в качестве выбранного элемента JComboBox с помощью Renderer
У меня есть класс DAOImplementation с определением метода ниже.
@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 Level (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 уровня Grade), ((GradeLevel) value).getGradelevel());
возвращает целочисленное значение
Я понимаю что даже когда JComboBox
имеет рендер, который отображает целое значение GradeLevel
используя ((GradeLevel)value).getGradeLevel()
, фактическое значение на JComboBox
до сих пор рассматривается как случай GradeLevel
или объект. Но не String
или же int
,
Поэтому моя проблема в том, что когда я пытаюсь установить выбранное значение в значение int, оно не изменит выбранное значение JComboBox
, Ничего не происходит, когда я использую setSelectedItem();
Это то, что я пытался сделать для GUI.
//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
иметь?
Благодарю.
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, которая стоит потратить время на изучение и понимание.