我有一个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
返回一个整数值。
我了解即使((GradeLevel) value).getGradelevel());
的渲染器使用JComboBox
显示整数值GradeLevel
,((GradeLevel)value).getGradeLevel()
上的实际值仍会被视为实例JComboBox
或对象。但不是GradeLevel
或String
。
所以我的问题是当我尝试将所选值设置为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
JOptionPane.showMessageDialog(null,"GradeLevel: "+gradeLevel);
我似乎无法比较我试图将其设置为(JOptionPane.showMessageDialog(null,"GradeLevel: "+gradeLevel.getGradeLevel());
)的对象与gradeLevel
具有的对象JComboBox
) 。请注意单数和复数。
如何操纵类型,以便gradeLevels
与setSelectedItem()
具有的匹配?
感谢。
答案 0 :(得分: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中使用了很多,非常值得花时间学习和理解