gpt4 book ai didi

java - JComboBox setSelectedItem 错误还是功能?

转载 作者:行者123 更新时间:2023-12-02 05:58:53 26 4
gpt4 key购买 nike

设置所选项目的原始代码是:

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)

class Language {
String code; // eg. "en"
String name; // eg. "English"
...
}

如果将语言项添加到组合框,则 toString 函数将用于显示项。在上面的类中,toString 函数将返回名称。调用 setSelectedItem("en") 失败,因为

String.equals(Language) 将失败,因为 Language.toString() 将返回“English”

相反,Language.equals(String) 会有所帮助,因为 Language 类可以覆盖

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

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

最佳答案

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

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

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

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

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

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

如果您很幸运已经使用了 Java 8,那么从列表中选择所需的项目就很简单了,如果没有,那么您将不得不使用循环编写一些样板代码,但至少您将拥有正确的 等于实现和清白的良心。

关于java - JComboBox setSelectedItem 错误还是功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22840386/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com