我的情况在这里非常具体:
首先,我有一个已经定义的字符串数组,其中包含JComboBox的默认选项(对于所有用户来说总是相同的(:
private static final String[] JOB_TYPE = {options go here};
这些选项加载到 JComboBox 中,如下所示:
private JComboBox jobType = new JComboBox(JOB_TYPE);
然后,还有其他选项可能因用户而异,我也必须在 JComboBox 中加载这些选项。由于数组具有固定数量的元素,因此我必须找到另一种方法将默认选项以外的特定选项添加到JComboBox中。所以我所做的是,我创建了一个 LinkedList,并使用 Arrays 中的 asList 方法来加载数组的默认选项,然后添加其他选项,这些选项因用户而异:
private List<String> allJobs = new LinkedList<String>(Arrays.asList(JOB_TYPE));
allJobs现在可以使用 toArray(( 方法作为 JCombobox 的参数传递:
private JComboBox jobType = new JComboBox(allJobs.toArray());
现在,我在 allJobs 中拥有所有默认选项,并且由于它不再是数组,我还可以向其添加将按如下方式加载的特定选项:
for (int j = 0; j < modelJobCustomType.getSize(); j++) {
allJobs.add(((XmlJobCustomElem) modelJobCustomType.getElementAt(j)).getName());
}
现在,这是我的问题:
当我检查 JComboBox 的内容时,我只找到默认选项,而不是特定的选项,即使我可以使用调试器看到列表大小增加了并且它还包含特定选项。
我的猜测是,由于jobType,JOB_TYPE和allJobs是全局变量,因此在编译器到达加载特定选项的代码部分之前,ComboBox就会被填充,这可能就是为什么我只能看到默认选项的原因。
这是对的吗?如果是这样,我该如何解决这个问题。请记住,这些全局变量必须保持全局,因为它们也在类的许多其他部分中使用。
感谢您的帮助
组合框被赋予从列表派生的数组。之后添加到列表中不会改变数组值(数组是固定长度值(,
还有一个带有Vector
参数的JComboBox
,它允许添加(而不是数组(。
但是,最好的是具有最高级别ComboBoxModel<E>
参数的JComboBox
。有一个默认的实现DefaultComboBoxModel
:
DefaultComboBoxModel<String> model = new DefaultComboBoxModel<>(JOB_TYPE);
model.addElement("custom0");
model.addElement("custom1");
combobox = new JComboBox(model);
您可以像这样初始化您的类,以便在初始化时将所有作业保留在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());
}
你可以看看源代码: 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: }
构造函数创建 DefaultComboBoxModel 的新实例。