JComboBox setSelectedItem错误还是功能?

时间:2014-04-03 14:13:06

标签: java jcombobox

所选项目的原始代码为:

public void setSelectedItem(Object anObject) {
    Object oldSelection = selectedItemReminder;
    Object objectToSelect = anObject;
    if (oldSelection == null || !oldSelection.equals(anObject)) {

        if (anObject != null && !isEditable()) {
            // For non editable combo boxes, an invalid selection
            // will be rejected.
            boolean found = false;
            for (int i = 0; i < dataModel.getSize(); i++) {
                E element = dataModel.getElementAt(i);
                if (anObject.equals(element)) {
                    found = true;
                    objectToSelect = element;
                    break;
                }
            }
            if (!found) {
                return;
            }
        }

在我看来这行

 if (anObject.equals(element)) {

应该是

 if (element.equals(anObject)) {

考虑一个显示例如的组合框。语言 然后你就像

这样的课程
class Language {
     String code; // eg. "en"
     String name; // eg. "English"
...
}

如果将语言项添加到ComboBox,则toString函数用于显示项目。在上面的类中,toString函数将返回名称。调用setSelectedItem(&#34; en&#34;)失败,因为

String.equals(语言)将失败,因为Language.toString()将返回&#34;英语&#34;

另一种方式是Language.equals(String),因为语言可以覆盖

boolean equals(String comp) {
   return comp.equals(code)
}

为了澄清,我知道如何创建一个具有所需行为的Combobox,我的问题是:原始代码中的比较是一个错误还是我错过了一些基本的东西?

2 个答案:

答案 0 :(得分:2)

正确实施的Object.equals是对称的,这意味着anObject.equals(element)element.equals(anObject)之间应该没有区别。

您正在描述组合框模型包含Item类型的对象的情况,但您希望通过指定Prop类型的对象来选择项目,其中Prop的值}描述了Item的一些属性。

使用技术上不正确的equals()方法实现,您可以通过传递Prop而不是Item的实例来选择组合框项目。

使用原始代码,您必须在equals()课程中提供损坏的Prop实施,并且通过修改,您必须在equals()中提供损坏的Item实施类。如果Prop是某个库类(在您的示例中为String),那么前一种情况当然是不可能的,并且我假设您提议修改的原因是允许后一种情况。

我不确定图书馆创建者是否试图阻止程序员通过选择特定的equals()表达式来实现损坏的anObject.equals(element),但即使它是element.equals(anObject),它仍然会不良做法只是为了简化组合框选择而故意提供错误的equals()实现。

按属性执行选择的正确方法是在组合框数据中搜索具有所需属性的项目,或者创建具有所需属性的全新Item实例,然后将该项目传递给{ {1}}。

如果你很幸运已经使用了Java 8,那么从列表中选择所需的项目是一行的,如果没有,那么你将不得不用循环编写一些样板代码,但至少你将拥有正确的{{ 1}}实施和清洁良心。

答案 1 :(得分:0)

要覆盖继承的equals方法,您应该将对象作为参数而不是String

传递
public boolean equals(Object obj){
//code goes here
}