2017-06-11 1 views
2

J'ai donc essayé d'utiliser un combobox pour afficher différentes options de catégorie pour différents types d'aliments. Chaque type d'aliment a sa propre liste de tableaux, donc légumes, fruits, produits laitiers, etc. Ainsi, lorsque l'utilisateur sélectionne une catégorie d'aliments, il affiche tous les aliments de cette catégorie dans une zone de texte. Cependant, la liste ne cesse de se répéter une fois chaque fois qu'une catégorie différente est sélectionnée. Donc, le premier clic est bien et affichera la liste des aliments une seule fois. Mais si vous sélectionnez une catégorie différente après cela, la liste se répétera. Voici le code que je utilise en ce moment:La sortie ArrayList se répète?

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); 

Donc, avec cela, si je choisis la catégorie des fruits d'abord, il sortira « 1. Pomme 2. orange 3. Fraise » Mais si je sélectionnez la catégorie des légumes après, il sortie « 1. laitue 2. carotte 3. brocoli 4. laitue 5. carotte 6 brocoli »

quelqu'un at-il des suggestions sur la façon de faire en sorte la liste sera o nly affichage une fois?

+1

Chaque fois que 'categoryBoxActionPerformed' vous ajoutez les articles à nouveau les listes, donc plus vous appelez' fois categoryBoxActionPerformed', le plus de fois les listes répétera – MadProgrammer

+0

Tout ce que vous devez faire est de ré-initialiser 'ArrayList' avec chaque appel de' categoryBoxActionPerformed' – Yahya

Répondre

3

Chaque fois que vous invoquez categoryBoxActionPerformed, vous ajoutez les mêmes articles à la ArrayLists.

Pour résoudre ce problème, vous pouvez le faire une des opérations suivantes:

  1. soit ré-initialiser le ArrayLists chaque fois que vous invoquez categoryBoxActionPerformed(), il ressemble à ceci:

    //at the beginning of the method. 
    fruitsList = new ArrayList<>(); 
    veggiesList = new ArrayList<>(); 
    dairyList = new ArrayList<>(); 
    
  2. Ou l'emballage avec un boolean:

    boolean firstTime = true; // create a global variable 
    

    wrap et l'ajout:

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

Vous appelez Collections.addAll(...) à l'intérieur de l'écouteur ActionEvent cela signifie que chaque clic ajoutera de nouveaux éléments dans ArrayList. Pour corriger cela, vous devez initialiser toutes les listes du constructeur (ce qui est plus correct si vous avez une liste de produits fixe) ou appeler la méthode clear() avant Collections.addAll(...) pour chaque liste (si vous avez vraiment besoin de changer les listes de produits à l'intérieur de l'écouteur d'événement)