如何从 Java 的组合框中删除特定项目?

Posted

技术标签:

【中文标题】如何从 Java 的组合框中删除特定项目?【英文标题】:How would I remove a specific item from a combo box in Java? 【发布时间】:2015-04-22 12:46:16 【问题描述】:

我正在使用字符串数组来填充带有项目的组合框。在按下按钮选择并提交一个项目后,我希望它从组合框中删除该项目。我的尝试是先从字符串数组中删除选定的项目,然后从组合框中删除所有项目,然后用字符串数组重新填充它。

choice 是字符串数组,cboChoice 是组合框,strChoice 是要移除的项目

for(int i = 0; i < choice.length; i++) 
        if(choice[i].equals(strChoice)) 
            choice[i] = null;
            cboChoice.removeAllItems();
            cboChoice.addItem(choice);
        
    

据我所知,我不知道是否有更简单的方法可以做到这一点,但我似乎无法让它发挥作用。

【问题讨论】:

【参考方案1】:

由于您有一个 String 数组和一个 JComboBox 具有相同顺序的相同项目,您可以使用 JComboBox.getSelectedIndex() 检索所选项目的索引位置并从 JComboBox 中删除,您就是数组。

作为建议,我会将您的 String 数组设为 ArrayList,它是一个“更智能”的动态数组,并且可以更好地与您的 JComboBox 保持同步。还要确保先从数组中删除,然后再从 JComboBox 中删除,否则所选索引可能会更改。

ArrayList 声明如下所示:

ArrayList<String> choice = new ArrayList<>();

将您的内容添加到此列表中,如下所示:

choice.add(yourChoice);

删除项目如下:

if (cboChoice.getSelectedIndex() > -1) 
        choice.remove(cboChoice.getSelectedIndex());
        cboChoice.getSelectedIndex();

希望这会有所帮助...此外,一旦您了解其工作原理,我建议您研究 ComboBoxModel。某些摇摆控件具有模型对象,您可以使用这些对象添加/删除/修改内容,而无需参考实际控件。

【讨论】:

【参考方案2】:

如果你检查jComboBox Javadoc你会看到

removeItem(Object anObject) 从项目列表中删除项目。

只需调用它即可删除您不再需要的对象。

您提出的代码可以工作(尽管我不确定 jComboBox 将如何处理空值)但不是特别有效。

【讨论】:

谢谢,我现在添加了这个,但是当我运行并删除该项目时,它不会更新 GUI 上的组合框? 您可能需要确保传入准确的字符串对象(即循环遍历并在找到choice[i] 时执行removeItem(choice[i]))。为了提高效率,请执行break;,这样您就不会扫描列表的其余部分。【参考方案3】:

此代码有效,但仍有一个问题;您不能删除列表中的最后一项。为了解决这个问题,您可以将一个元素添加到您在删除步骤中忽略的列表中。过去我在列表的开头使用了“”。

我还要指出,JComboBox 的大多数示例都使用字符串显示,但您可以将任何类型的 Object 放入框中。框中的项目将显示 Object.toString()。在许多情况下,取回您想要的实例比根据从 ComboBox 获取的信息在列表中查找它更有用和更直接。

import javax.swing.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * Created by bday on 4/22/15.<br>
 * <br>
 *  ItemRemovingComboBox will do something useful I'm sure
 */
public class ItemRemovingComboBox 
    private final JFrame frame = new JFrame();
    private final List<String> strings = new ArrayList<String>();
    private final JComboBox cb;
    private final ItemListener itemListener;

    public ItemRemovingComboBox()
    
        String[] testItems = new String[] "one", "two", "three";
        strings.addAll(Arrays.asList(testItems));
        cb = new JComboBox(testItems);
        frame.add(cb);
        frame.setSize(200, 200);
        frame.setVisible(true);

        itemListener = new ItemListener() 
            public void itemStateChanged(ItemEvent itemEvent) 
                if (itemEvent.getStateChange() == ItemEvent.SELECTED) 
                    String item = (String) itemEvent.getItem();
                    System.out.println("Item: " + item + " removed from list");
                    removeItem(item);
                
            
        ;
        cb.addItemListener(itemListener);
    

    private void removeItem(String item) 
        //this step is required to keep from calling back to the listener with new selection when item is removed
        cb.removeItemListener(itemListener);
        strings.remove(item);
        cb.removeItem(item);
        cb.addItemListener(itemListener); //okay now we what to know about changes again
    

    public static void main(String[] args) 
        new ItemRemovingComboBox();
    

【讨论】:

以上是关于如何从 Java 的组合框中删除特定项目?的主要内容,如果未能解决你的问题,请参考以下文章

如何删除组合框中的所有项目? [关闭]

如何根据 DataGridView 中的选定行将组合框中的特定项目设置为选定项?

如何从 VB.net 组合框中的数据库中获取特定列的所有行?

JavaFX - 从其他组合框中删除所选项目

从绑定到数据集的组合框中删除重复项

从组合框中删除 extjs 3.4 中的参数