Java 更新LinkedList

Java 更新LinkedList,java,swing,linked-list,jcombobox,Java,Swing,Linked List,Jcombobox,我的情况在这里非常具体: 首先,我已经定义了一个字符串数组,其中包含JComboBox的默认选项(对于所有用户都是相同的): private static final String[] JOB_TYPE = {options go here}; 这些选项加载到JComboBox中,如下所示: private JComboBox jobType = new JComboBox(JOB_TYPE); for (int j = 0; j < modelJobCustomTyp

我的情况在这里非常具体:

首先,我已经定义了一个字符串数组,其中包含JComboBox的默认选项(对于所有用户都是相同的):

private static final String[]   JOB_TYPE = {options go here};
这些选项加载到JComboBox中,如下所示:

private JComboBox   jobType = new JComboBox(JOB_TYPE);
    for (int j = 0; j < modelJobCustomType.getSize(); j++) {
        allJobs.add(((XmlJobCustomElem) modelJobCustomType.getElementAt(j)).getName());
    }
然后,我还必须在JComboBox中加载不同用户的其他选项。由于数组具有固定数量的元素,因此我必须找到另一种方法将默认选项之外的特定选项添加到JComboBox中。我所做的是,创建了一个LinkedList,并使用数组中的asList方法加载数组中的默认选项,然后添加其他选项,这些选项因用户而异:

private List<String> allJobs = new LinkedList<String>(Arrays.asList(JOB_TYPE));
现在,我在allJobs中有了所有默认选项,并且由于它不再是一个数组,我还可以向其中添加特定选项,这些选项将按如下方式加载:

private JComboBox   jobType = new JComboBox(JOB_TYPE);
    for (int j = 0; j < modelJobCustomType.getSize(); j++) {
        allJobs.add(((XmlJobCustomElem) modelJobCustomType.getElementAt(j)).getName());
    }
for(int j=0;j
现在,我的问题是:

当我检查JComboBox的内容时,我只找到默认选项,而没有找到特定的选项,尽管我可以使用调试器看到列表大小增加了,并且它也包含特定的选项

我的猜测是,由于jobType、JOB_TYPE和allJobs都是全局变量,所以在编译器到达加载特定选项的代码部分之前,组合框就已经填充好了,这可能就是为什么我只能看到默认选项的原因

这是正确的吗?如果是这样,我如何解决这个问题。请记住,这些全局变量必须保持全局,因为它们也在类的许多其他部分中使用


感谢您的帮助

您可以这样初始化类,以便在初始化时保留
所有作业
中的所有作业,而不是像Jamie的解决方案那样只存在于
JComboBox
中的自定义作业。您还可以在构造函数中初始化所有实例字段:

class Main {
    private static final List<String> FIXED_OPTIONS = Arrays.asList("fixed0", "fixed1", "fixed2");

    private List<String> allJobs = new ArrayList<>(FIXED_OPTIONS);
    {
        int count = 6;
        for (int i = 0; i < count; i++) {
            allJobs.add("custom" + i);
        }
    }

    private JComboBox jobType = new JComboBox(allJobs.toArray());
}
主类{
私有静态最终列表FIXED_OPTIONS=Arrays.asList(“fixed0”、“fixed1”、“fixed2”);
private List allJobs=new ArrayList(固定选项);
{
整数计数=6;
for(int i=0;i
您可以查看源代码:JComboBox

181:   /**
182:    * Constructs JComboBox with specified list of items.
183:    *
184:    * @param itemArray array containing list of items for this JComboBox
185:    */
186:   public JComboBox(Object[] itemArray)
187:   {
188:     this(new DefaultComboBoxModel(itemArray));
189:     
190:     if (itemArray.length > 0) 
191:       setSelectedIndex(0);
192:   }

构造函数创建DefaultComboxModel的一个新实例。

组合框被赋予从列表派生的数组。之后添加到列表不会更改数组值(数组是固定长度值)

还有一个
JComboBox
,带有
Vector
参数,允许添加(与数组相反)

然而,最好的是一个
JComboBox
,它带有一个级别最高的
comboxmodel
参数。有一个默认实现:

DefaultComboxModel=new DefaultComboxModel(作业类型);
模型.附录(“自定义0”);
型号.附录(“客户1”);
combobox=新的JComboBox(型号);

听起来你是对的。在初始化所有作业之前,是否可以延迟实例化
jobType
?或者,您可以使用JComboxAPI来更新其内容(
addItem(…)
removietem(…)
,等等)。我甚至不知道addItem()方法。非常感谢你,这正是我必须做的。你能添加你的评论作为回答吗,这样我就可以接受了?谢谢你的时间。你的答案适用于许多不同的场景,但不幸的是,我的答案不适用。初始化时,编译器将抛出
ArrayIndexOutOfBoundsException
,因为
modelJobCustomType
MapListComboModel
仍然没有元素且大小为零。因此,当我尝试像这样加载自定义作业时:
allJobs.add(((xmljobscustomelem)modeljobscustomtype.getElementAt(j)).getName(),将引发异常。