无法使用Renderer将Object实例设置为JComboBox的选定项

时间:2017-02-14 04:33:53

标签: java swing jcombobox listcellrenderer

我有一个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 ......等等......)我已经验证了,因为我尝试打印{返回的输出{1}}

现在我的问题出在我的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值),GradeLevel返回一个整数值。

enter image description here

我了解即使((GradeLevel) value).getGradelevel());的渲染器使用JComboBox显示整数值GradeLevel((GradeLevel)value).getGradeLevel()上的实际值仍会被视为实例JComboBox或对象。但不是GradeLevelString

所以我的问题是当我尝试将所选值设置为int值时,它不会更改int的选定值。使用JComboBox

时没有任何反应

这就是我尝试为GUI做的事情。

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

enter image description here

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

enter image description here

我似乎无法比较我试图将其设置为(JOptionPane.showMessageDialog(null,"GradeLevel: "+gradeLevel.getGradeLevel()); )的对象与gradeLevel具有的对象JComboBox) 。请注意单数和复数。

如何操纵类型,以便gradeLevelssetSelectedItem()具有的匹配?

感谢。

1 个答案:

答案 0 :(得分:1)

如果要通过使用对象的不同实例来执行此操作,但具有相同的属性,则需要覆盖类的equalshashcode方法,以便属性的组合是独一无二的。这非常重要,这是一种关系期望,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中使用了很多,非常值得花时间学习和理解