我尝试使用对象名称填充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);
当我使用名为ArrayList
和Obj1
的2个对象填充Obj2
时,会出现以下问题:
调用populateComboBox()
时,组合框仅显示第二个对象,即仅显示Obj2
。预期显示为Obj1
,Obj2
。
因为它只显示Obj2
。当populateComboBox()
被调用两次时,组合框会显示两个Obj2
。调用三次时,它会显示三个Obj2
。即调用方法的次数,Obj2
在组合框中显示的次数。
categoryList
ArrayList
是否应该在Category
班级内?还是应该在控制类内呢?我对这个感到有些困惑。答案 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);