- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
设置所选项目的原始代码是:
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/
我在使用 JComboBox 的 setSelectedItem 方法时遇到问题。它只是不起作用。这是我的代码;我的站类和分区类都还可以。所以他们不包括在内。无论我尝试什么,我都无法将项目设置为组合框
我创建了一个包含三个项目的组合框。我正在尝试按索引和值设置所选项目。 当我执行 setSelectedIndex () 时,代码运行良好。 我正在尝试按值设置所选项目。所以我尝试创建另一个具有相同值(
我在设置自定义 JComboBox 的精确值时遇到问题。如果我从以下类的 initialize() 方法调用 setSelectedItem(),它不会选择特定值。 扩展的 JComboBox 类是:
设置所选项目的原始代码是: public void setSelectedItem(Object anObject) { Object oldSelection = selectedItemR
我的 jTable 第 8 列是美国州列。这是我的代码,用于使用适当的项目设置 jComboBox 以显示状态。 当我使用 Buffered Reader 填充 Jtable 时,下面的代码可以很好地
我试图在填充组合框之后在我的 JPanel 类的构造函数中设置 JComboBox 的 setSelectedItem。 我为文本框设置了值,但我不明白为什么 setSelectedItem 似乎不起
我的代码很简单......我想当我按下按钮时将面板中所有标签的文本设置为“”(无)/正在工作/并将所有组合框设置为值1。//这不起作用。它仅将 ArrayList amout 中的第一个组合框(七个组
我有一个JComboBox JComboBox tableChoose = new JComboBox(); tableChoose.addItem("Bill"); tableChoose.addI
我在 JDialog 中有一个以 JComboBox 开头的表单: myJComboBox = new JComboBox(itemOfBox); myJpanel.add(myJComboBox);
我有一个 JTable,我将三个 JComboBox 添加到三个不同的列。现在我想为我的每一行设置所选项目。问题是,我需要每一行的 ID 才能做到这一点。所以我尝试了不同的监听器,最好的结果是使用 F
我有一个包含多个组合框的程序,每个组合框都有自己的 Action 监听器。从任一组合框中选择一项将更改一个或多个其他组合框中的项目。我遇到的问题是,为一个组合框调用 setSelectedItem()
这个问题已经有答案了: What is a NullPointerException, and how do I fix it? (12 个回答) 已关闭 7 年前。 我无法理解为什么这段代码不起作用
本文整理了Java中org.pentaho.ui.xul.components.XulMenuList.setSelectedItem()方法的一些代码示例,展示了XulMenuList.setSel
我有一个在 JComboBox 中值更改事件时调用的方法 public void actionPerformed( ActionEvent e ) { Object source = e.ge
请看下面的代码片段, String[] choices = {"Apple", "Banana", "Custard"}; JComboBox fruits = new JCombo
我是一名优秀的程序员,十分优秀!