使用ListModel更改JComboBox模型。它有隐藏的后果吗?

时间:2011-05-06 14:25:26

标签: java swing jlist jcombobox

我在不同的地方使用JList和JComboBox。两者的内容都是动态变化的。

一旦创建了一个comboBox,你就不能说comboBox.setModel(String []),你必须创建一个新模型,然后将它设置为comboBox。

JList也是如此。

我没有创建自己的Jlist和ComboBox来添加一个名为.setNewModel(String [])的新方法,而是在我的“实用程序”类中创建了一个静态方法,它接收一个String []并返回一个ListModel。

所以我可以这样做:

someComboBox.setModel((ComboBoxModel)UtilityClass.convetToListModel(aStringArray));

我对JList使用相同的内容。

someList.setModel(UtilityClass.convetToListModel(anotherStringArray));

我的问题是:

将listModel转换为ComboBoxModel会产生一些意想不到的后果吗? 如果是这样,无论如何都要更改comboBox的整个内容而不必将ArrayString转换为Model?

这是方法的代码:

public static ListModel convertToListModel(String[] nList)
{
    return (new JComboBox(nList).getModel());
}

程序编译并运行正常,但是铸造总是会让我产生怀疑,特别是复杂的对象。 是的,我知道我可以扩展JComboBox和JList来添加一个方法来完成这项工作,但它还有很多额外的工作。为什么ComboBox和Jlist没有更新或修改模型而不接受简单的字符串数组?

3 个答案:

答案 0 :(得分:5)

怎么样

someComboBox.setModel((ComboBoxModel)UtilityClass.convetToListModel(aStringArray));

以任何方式更容易编写/更简单/无论

someComboBox.setModel(new DefaultComboBoxModel(aStringArray))

您添加的所有内容都是Utility方法形式的白噪声。加上

  • 该方法的实现简直就是......疯狂:你创建一个 JComboBox 只是为了访问该组合内部创建的模型...
  • 你必须利用实现来进行类型转换才能在真正的组合中使用...

不要做那些浪费/不必要的事情,甚至在想到达到同一目标的简单直接方式时也不要走弯路

答案 1 :(得分:3)

如果list / combobox的内容需要动态更改,那么您应该直接管理模型本身。您不应每次都创建新模型并替换旧模型。拥有模型的关键在于您可以更新它包含的数据。

只需创建自己的DefaultListModelDefaultComboBoxModel并将其传递到JList / JComboBox即可。然后根据需要使用模型的添加/删除方法来更新内容。

private DefaultComboBoxModel model = new DefaultComboBoxModel();
private JComboBox combo = new JComboBox(model);
...

model.addElement(somethingForMyList);
...
model.removeAllElements();
...
model.removeElement(elementToRemove);

答案 2 :(得分:0)

通常我更愿意实现一个继承自DefaultComboBoxModel的新类(因此它也是ListModel以及ComboBoxModel)。这个新类将通过方法来丰富,以便根据任何可能的情况需求更新模型。在更新方法中,您可以调用fireContentsChanged告诉封闭组件内容已更改,组件应重绘所有内容。

希望它有所帮助。