Невозможно установить экземпляр объекта в качестве выбранного элемента 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, которая стоит потратить время на изучение и понимание.

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