我正在使用JList,我遇到了一些设计问题。 我想要的是一个gui组件,它提供一个列表,让用户添加或删除它的值。
所以我创建了一个接收列表的类
List<? exteds IDisplayable>
当我的GUI表单加载时,我遍历列表并执行
MylistModel.addElement(iDisplayable.getDisplayString()
这是因为我不希望它显示toString()。所以我添加了一个方法。
现在我的问题是如何将列表返回到调用它的gui表单。 我应该迭代它并按名称进行比较吗?这听起来很糟糕。
我需要在ListModel中放入对象,但显示不同的toString。 我应该创建一个新的listmodel吗?我甚至无法扩展AbstractListModel,因为它使用toString 这是唯一的解决方案吗?
答案 0 :(得分:2)
如前所述,xxRenderer是协作者,它决定“集合组件”(例如JList,JTable等)中显示的项目的所有可视化表示。当坚持核心Swing支持时,要走的是实现自定义渲染器。 SwingX支持更轻量级的方法,允许插件字符串显示(和视觉装饰,但这是一个与此不同的故事):实现自定义StringValue(SwingX代表字符串转换器)并将其传递给SwingX渲染器,如
StringValue sv = new StringValue() {
@Override
public String getString(Object value) {
if (value instanceof MyObject) {
return .... // use MyObject properties to build a suitable rep
}
return TO_STRING.getString(value);
}
}
list.setCellRenderer(new DefaultListRenderer(sv));
// a bit of beauty: same rep is re-usable in other collection components
table.setCellRenderer(MyObject.class, new DefaultTableRenderer(sv);
comboBox.setRenderer(list.getCellRenderer());
tree.setTreeCellRenderer(new DefaultTreeRenderer(sv));
换句话说:SwingX在其所有集合组件中支持统一的字符串表示。该方法的全部功能在排序/过滤/搜索时显示:所有功能都自动使用该自定义字符串表示,即默认情况下用户排序/过滤/搜索他们看到的内容 - 开发人员无需额外工作:-)
答案 1 :(得分:1)
您可以创建一个包含IDisplayable对象的包装器对象,并实现一个只调用IDisplayable上的getDisplayString()的toString()方法。可能不是那么好,但可能比创建自己的列表模型更好。
编辑:不知道为什么一开始没出现这个问题。但似乎ListCellRenderer
真的是你需要的:
http://download.oracle.com/javase/tutorial/uiswing/components/list.html
答案 2 :(得分:0)
我应该迭代它并进行比较 名称?听起来很糟糕。
非常糟糕。您可以要求所选项目的索引,因此您无需进行比较,但可以立即获取正确的对象。问题是这种快速而肮脏的方法是否足够好。正如您已经提到的,新的列表模型将是“干净”的解决方案。