ArrayList输出重复吗?

时间:2017-06-11 01:08:35

标签: java swing arraylist jcombobox

所以我正在尝试使用组合框来显示不同类型食物的不同类别选项。每种类型的食物都有自己的阵列列表,所以蔬菜,水果,乳制品等等。因此,当用户选择食物类别时,它将在文本区域中显示该类别的所有食物。但是,只要选择了不同的类别,列表就会重复一次额外的时间。所以第一次点击很好,只会显示一次食物清单。但如果您在此之后选择其他类别,则列表将重复。这是我现在正在使用的代码:

public class foodTypesJFrame extends javax.swing.JFrame {

// Food category arraylists
ArrayList <String> fruitsList = new ArrayList();
ArrayList <String> veggiesList = new ArrayList();
ArrayList <String> dairyList = new ArrayList();



public void foodCategory(String box, String category, ArrayList list)
{
    box = foodCategoryBox.getSelectedItem() + "";

    if (box.equals(category))
    {
        foodOutput.setText("");
        int indexNumber = 0; 
        // Display the different foods
        for (int index = 0; index < list.size(); index++) 
        { 
            indexNumber = index + 1; 
            foodOutput.append(indexNumber + ". " + list.get(index) + "\n"); 
        }
    }
}        

private void categoryBoxActionPerformed(java.awt.event.ActionEvent evt) {                                            

    String foodType = foodCategoryBox.getSelectedItem() + "";

    String fruits = "Fruits";
    String veggies = "Vegetables";
    String dairy = "Dairy";

    Collections.addAll(fruitsList, "Apple", "Orange", "Strawberry");
    Collections.addAll(veggiesList, "Lettuce", "Carrot", "Broccoli");
    Collections.addAll(dairyList, "Milk", "Cream", "Cheese");

    foodCategory(foodType, fruits, fruitsList);
    foodCategory(foodType, veggies, vegetableList);
    foodCategory(foodType, dairy, dairyList);

因此,如果我首先选择水果类别,它将输出 “1. Apple   2.橙色   3.草莓“ 但如果我之后选择蔬菜类别,它将输出 “1.生菜   胡萝卜   西兰花   生菜   胡萝卜   6西兰花“

有没有人对如何制作它有任何建议,所以列表只会显示一次?

2 个答案:

答案 0 :(得分:3)

每次调用categoryBoxActionPerformed时,您都会将 相同的 项添加到ArrayLists

要解决此问题,您可以执行以下操作之一:

  1. 每次调用ArrayLists时都重新初始化categoryBoxActionPerformed(),所以它看起来像这样:

    //at the beginning of the method.
    fruitsList = new ArrayList<>();
    veggiesList = new ArrayList<>();
    dairyList = new ArrayList<>();
    
  2. 或用boolean包裹它:

    boolean firstTime = true; // create a global variable
    

    然后包装添加:

    if(firstTime){
       Collections.addAll(fruitsList, "Apple", "Orange", "Strawberry");
       Collections.addAll(veggiesList, "Lettuce", "Carrot", "Broccoli");
       Collections.addAll(dairyList, "Milk", "Cream", "Cheese");
       firstTime = false;
    }
    

答案 1 :(得分:0)

您在Collections.addAll(...)侦听器中呼叫ActionEvent,这意味着每次点击都会将新元素添加到ArrayList中。要解决此问题,您需要初始化构造函数中的所有列表(如果您有固定的产品列表,更准确),或者在clear()之前为每个列表调用Collections.addAll(...)方法(以防万一)如果你真的需要在事件监听器内更改产品列表)