1

所以我有一个 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"))
4

2 回答 2

3

问题是,组合框中的项目不是Strings。尝试比较ObjectusingmapSelectionBox.getSelectedItem().equals("Create Map")是行不通的,因为equals不会使用 the 的toString方法,Object而是会对对象的状态进行内部比较。

尝试使用类似...

mapSelectionBox.getSelectedItem().toString().equalsIgnoreCase("Create Map")

...反而...

于 2013-05-13T00:37:59.970 回答
2

您正在尝试查看一个 String 是否等于一个非 String 对象,一个由匿名内部类创建,一个只有一个toString()返回您感兴趣的 String 的对象,所以 if 测试当然会失败。现在,如果您覆盖该Object 的equals(Object o)andhashCode()以匹配 String 的 and,那么您将得到不同的结果。

但更重要的是,您的 JComboBox 模型应该只包含一种类型的对象,而不是与某些具有时髦toString()结果的匿名内部类混合的字符串。

于 2013-05-13T00:37:30.107 回答