我正在尝试使用对象名称填充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);
当我用两个名为 Obj1
和 Obj2
的对象填充 ArrayList
时,出现以下问题:
当调用
populateComboBox()
时,组合框仅显示第二个对象,即仅显示Obj2
。预期显示为Obj1
、Obj2
。因为它只显示
Obj2
。当调用populateComboBox()
两次时,组合框会显示两个Obj2
。调用三次时,它会显示三个Obj2
。即该方法被调用的次数,Obj2
在组合框中显示的次数。categoryList
ArrayList
应该位于Category
类中吗?或者它应该在控制类内部?我对这个有点困惑。
最佳答案
你的问题是你的设计被破坏了。类别的 catName 名称字段是静态的,因此整个类只存在一个对象。如果你改变它,你就在全类范围内改变它。这就是为什么 Obj1 和 Obj2(顺便说一下,变量的坏名称)共享相同的名称并显示相同的名称。
这个类应该分为两个类,一个类称为 Category,它没有静态字段,没有 List 字段,有私有(private)实例字段、构造函数、公共(public)方法,另一个类可能称为 Category,它包含一个非-静态ArrayList<Category>
,与 addCategory(...)
以及这样的方法。在关心 GUI 之前先解决这个问题,否则你将把你的房子 build 在一个非常不稳定的基础上。每当您创建静态字段时,请始终问自己为什么要这样做,并强烈考虑是否可以将其改为实例。
关于java - 使用存储在 ArrayList 中的自定义对象填充 JComboBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42735826/