2017-03-11 1 views
0

JComboBox에 객체 이름을 채우려고합니다. 개체는 범주 형식이며 범주 클래스의 ArrayList (categoryList)에 저장됩니다. 나는 ArrayList 2 개체를 채울 때JComboBox에 ArrayList에 저장된 사용자 정의 객체 채우기

 List<Category> catList = new ArrayList<Category>(); 
     catList = Category.getCatList(); 
     Category list[] = new Category[catList.size()]; 
     list = catList.toArray(list); 

     for(int i = 0; i <list.length; i++) 
     {  
      selectCatComboBox.addItem(list[i].getCatName()); 
     } 
     addItemDialog.setVisible(true); 

: 여기

public class Category { 
    private static String catName; 
    private static List<Category> categoryList; 

    public static void addToCatList(String str) 
    { 
     Category cat = new Category(); 
     Category.setCatName(str); 

     categoryList.add(cat); 
    } 

    public static List<Category> getCatList() 
    { 
     return categoryList; 
    } 

    public static String getCatName() 
    { 
     return catName; 
    } 

    public static void setCatName(String catName) 
    { 
     Category.catName = catName; 
    } 

    @Override 
    public String toString() 
    { 
     return catName; 
    } 
} 

JCombobox (: populateComboBox() 메소드 이름)을 채우는 코드 : 여기

Category 클래스의 내용입니다 이름이 Obj1이고 Obj2 인 경우 다음과 같은 문제가 발생합니다.

  1. populateComboBox()이 호출되면 콤보 상자는 두 번째 개체 만 표시합니다. 즉, Obj2 만 표시합니다. 예상되는 디스플레이는 Obj1, Obj2입니다.

  2. Obj2 만 표시됩니다. populateComboBox()을 두 번 호출하면 콤보 상자에 두 개의 Obj2이 표시됩니다. 세 번 호출하면 세 개의 Obj2이 표시됩니다. 즉, 메소드가 호출되는 횟수, 콤보 상자에 표시되는 횟수는 Obj2입니다.

  3. categoryListArrayListCategory 클래스 안에 있어야합니까? 또는 컨트롤 클래스 내부에 있어야합니까? 나는 이것과 약간 혼동한다.
+0

@ 앤드류 톰슨 편집 해 주셔서 감사합니다! –

답변

1

디자인에 문제가있는 것입니다. 범주의 catName 이름 필드는 정적이므로 하나의 개체 만 존재합니다. 은 전체 클래스입니다. 변경하면 클래스 전체를 변경합니다. 이런 이유로 Obj1과 Obj2 (변수의 나쁜 이름)는 같은 이름을 공유하고 같은 이름을 표시합니다.

이 클래스는 정적 필드가없고 List 필드가없는 Category라는 두 클래스로 나눠야합니다.이 필드에는 private 인스턴스 필드, 생성자, public 메서드 및 비 정적 인 ArrayList<Category>, addCategory(...)와 같은 방법. GUI를 사용하기 전에 먼저이 문제를 해결하십시오. 그렇지 않으면 매우 불안정한 기반 위에 집을 짓게 될 것입니다. 정적 필드를 만들 때마다 항상이 작업을 수행하는 이유를 직접 물어보고 대신 인스턴스로 만들 수 있는지 확인하는 것이 좋습니다.

+0

댓글과 편집을 주셔서 감사합니다! ArrayList (3)를 어디에 저장해야하는지에 대한 의문을 해소했습니다. 나는 당신이 말한 변화를 만들었습니다. ArrayList가 저장되어있는'Categories' 클래스에'getCatList()'라는 메서드가 있습니다.이 정적을 만들어야하는지 궁금합니다. –

+0

@DR :이 시점에서 주요 메서드는 다음과 같습니다. 정적이어야하고, 그것에 관한 것입니다. –

+0

나는 당신이 말한 변화를 만들었지 만, 여전히 문제 2를 얻는다. 두 개의 객체를 추가 ('Obj1'과'Obj2'라고 이름 붙이기)를 ArrayList'에 추가하고'populateComboBox()'메소드를 두 번 호출하면됩니다.내 출력물은 Obj1'' Obj2' –

1

우선, 자체 목록이 포함 된 POJO (Plain Old Java Object)가 없습니다. 또한 키워드 "정적"은 개체의 모든 인스턴스에서 변수 중 하나만 가질 수 있음을 의미합니다.

public class Category { 
    private String name = null; // I always like to initialize my variables 

    public Category() { 
     // empty constructor method, but I like to have a no argument constructor 
    } 

    public Category(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @Override 
    public String toString() { 
     return catName; 
    } 
} 

List<Category> catList = new ArrayList<>(); 
catList.add(new Category("Category 1")); 
catList.add(new Category("Category 2")); 

for (Category category : catList) { 
    selectCatComboBox.addItem(category.getName()); 
} 
addItemDialog.setVisible(true); 
+0

의견을 주셔서 감사합니다. –