我在不同的地方使用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没有更新或修改模型而不接受简单的字符串数组?
答案 0 :(得分:5)
怎么样
someComboBox.setModel((ComboBoxModel)UtilityClass.convetToListModel(aStringArray));
以任何方式更容易编写/更简单/无论
someComboBox.setModel(new DefaultComboBoxModel(aStringArray))
您添加的所有内容都是Utility方法形式的白噪声。加上
不要做那些浪费/不必要的事情,甚至在想到达到同一目标的简单直接方式时也不要走弯路
答案 1 :(得分:3)
如果list / combobox的内容需要动态更改,那么您应该直接管理模型本身。您不应每次都创建新模型并替换旧模型。拥有模型的关键在于您可以更新它包含的数据。
只需创建自己的DefaultListModel
或DefaultComboBoxModel
并将其传递到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告诉封闭组件内容已更改,组件应重绘所有内容。
希望它有所帮助。