java - 使用存储在 ArrayList 中的自定义对象填充 JComboBox

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

当我用两个名为 Obj1Obj2 的对象填充 ArrayList 时,出现以下问题:

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

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

  3. 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/

相关文章:

java - 来自与 Apache Camel 的交换的具有相同路由键的多个队列

java - 如何使用@RequestBody 调用@RestController?

java - 从 maven 2 升级到 maven 3

android - RecyclerView 项目样式应用于过滤后的所有项目

java - 修复 Eclipse java 引用数据库损坏?

java - 设置 JFrame 而不与任务栏重叠

java - JTextArea 获取整行

java - 如何让动画在 JAVA 中通过键盘输入运行?

java - 从字符串中返回两个子字符串

java arraylist不能在for循环中工作