2017-06-11 10 views
2

私はコンボボックスを使用して、さまざまな種類の食品に異なるカテゴリオプションを表示しようとしています。野菜、果物、乳製品などの各タイプの食品には独自の配列リストがあります。ユーザーが食品カテゴリを選択すると、そのカテゴリのすべての食品がテキスト領域に表示されます。ただし、別のカテゴリが選択されると、リストは余分な時間を繰り返しています。最初のクリックはうまくいき、一度だけ食べ物リストが表示されます。それ以降に別のカテゴリを選択すると、リストは繰り返し表示されます。ここで私が今使っているコードです:これでそうArrayListの出力自体が繰り返されますか?

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.アップル 2.オレンジ 3.ストロベリー」 しかし、私の場合その後野菜のカテゴリを選択し、それが出力 「1.レタス 2.ニンジン 3.ブロッコリー 4.レタス 5.ニンジン 6ブロッコリー」

、誰もがそれを行う方法上の任意の提案を持っていますリストは一度表示する?

+1

たびに 'もう一度リストに項目を追加categoryBoxActionPerformed'、あなたは' categoryBoxActionPerformed'を呼び出す回以上ので、より多くの回数のリストが – MadProgrammer

+0

にあなたが必要とするすべてを繰り返します'categoryBoxActionPerformed'を呼び出すたびに' ArrayList'を再初期化することです – Yahya

答えて

3

あなたがcategoryBoxActionPerformedを起動するたびに、あなたはArrayLists同じ項目を追加しています。

  1. どちらか、それは次のようになりますので、あなたは、categoryBoxActionPerformed()を呼び出すArrayListsたびに再初期化:

    //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; 
    } 
    
0

リスナーActionEventの中にCollections.addAll(...)と呼んだ場合、これはそれぞれのクリックが新しい要素をArrayListに追加することを意味します。これを解決するには、クラスのすべてのリストをコンストラクタ内で初期化する必要があります(製品のリストが修正されている場合はより正確です)Collections.addAll(...)の前にclear()メソッドを呼び出す必要があります。イベントリスナー内の製品)

関連する問題