所以我有一个JComboBox,我能够很好地选择其中的每个项目。在System.out.print中,我得到了正确的值,尽管当我在字符串"Create Map"上预置.equals时,它不会被if控制语句捕获。我在这里错过了一些明显的东西吗?
mapSelectionBox = new JComboBox();
mapSelectionBox.setEditable(false);
Map aMapValues;
for(Entry<String, Map> obj : runInfo.getHashMap().entrySet()){
aMapValues = obj.getValue();
mapSelectionBox.addItem(obj.getKey());
}
Object addNewMap = new Object(){public String toString(){ return "Create Map"; } };
mapSelectionBox.addItem(addNewMap);
mapSelectionBox.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
if(mapSelectionBox.getSelectedItem().equals("Create Map")){
xCoordinatesTextField = new JTextField();
xCoordinatesTextField.setEditable(true);
windowContainer.add(xCoordinatesTextField, "6, 4, right, default");
System.out.println("Test");
}else{
System.out.println(mapSelectionBox.getSelectedItem());
}
}
});
所以我开始认为这是将getSelectedItem评估为一个对象,而不是一个字符串,因为它存储在哈希图中。是这样吗?
编辑:我想通了。我刚刚在上面的代码中更改了它。感谢您的评论。
String selectedItem = mapSelectionBox.getSelectedItem().toString();
if(selectedItem.equalsIgnoreCase("create map"))
问题是,组合框中的项目不是String
的。 尝试使用 mapSelectionBox.getSelectedItem().equals("Create Map")
比较Object
是行不通的,因为equals
不会使用 Object
的 toString
方法,而是会对对象的状态进行内部比较。
尝试使用类似...
mapSelectionBox.getSelectedItem().toString().equalsIgnoreCase("Create Map")
。相反。。。
您正在尝试查看 String 是否等于非 String 对象,一个由匿名内部类创建的对象,一个只有一个返回您感兴趣的字符串的toString()
的对象,所以 if 测试当然会失败。现在,如果您覆盖该对象的equals(Object o)
和hashCode()
以匹配字符串的和,那么您将得到不同的结果。
但更重要的是,你的JComboBox的模型应该只包含一种类型的对象,而不是与一些匿名内部类混合的字符串,这些内部类有一个时髦的toString()
结果。