使用存储在ArrayList

时间:2017-03-11 13:34:12

标签: java swing arraylist jcombobox

我尝试使用对象名称填充JComboBox。对象属于Category类型,存储在Category类的ArrayList(名为categoryList)中。

以下是Category类的内容:

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())的代码:

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

当我使用名为ArrayListObj1的2个对象填充Obj2时,会出现以下问题:

  1. 调用populateComboBox()时,组合框仅显示第二个对象,即仅显示Obj2。预期显示为Obj1Obj2

  2. 因为它只显示Obj2。当populateComboBox()被调用两次时,组合框会显示两个Obj2。调用三次时,它会显示三个Obj2。即调用方法的次数,Obj2在组合框中显示的次数。

  3. categoryList ArrayList是否应该在Category班级内?还是应该在控制类内呢?我对这个感到有些困惑。

2 个答案:

答案 0 :(得分:1)

你的问题是你的设计被破坏了。类别的catName名称字段是静态的,因此只有一个对象存在于整个类。如果你改变它,你可以在班级改变它。这就是为什么Obj1和Obj2(顺便说一下变量的坏名称)共享相同的名称并显示相同的名称。

这个类应分为两个类,一个叫做Category,它没有静态字段,没有List字段,有私有实例字段,构造函数,公共方法,另一个,也许叫做Categories,它们拥有一个非-static ArrayList<Category>addCategory(...)和这些方法。在关注GUI之前先解决这个问题,否则你将在一个非常不稳定的基础上建造你的房子。每当你创建一个静态字段时,总要问自己为什么要这样做,并强烈考虑看看你是否可以改为实例。

答案 1 :(得分:1)

首先,我不会有一个包含自身List的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);