JList - 关于toString()表示的设计问题

时间:2011-04-14 11:41:43

标签: java swing jlist

我正在使用JList,我遇到了一些设计问题。 我想要的是一个gui组件,它提供一个列表,让用户添加或删除它的值。

所以我创建了一个接收列表的类

List<? exteds IDisplayable> 
  • IDisplayable是一个具有String DisplayString()的简单接口。想要在列表中显示的每个对象都需要实现IDIsplayable。

当我的GUI表单加载时,我遍历列表并执行

MylistModel.addElement(iDisplayable.getDisplayString()

这是因为我不希望它显示toString()。所以我添加了一个方法。

现在我的问题是如何将列表返回到调用它的gui表单。 我应该迭代它并按名称进行比较吗?这听起来很糟糕。

我需要在ListModel中放入对象,但显示不同的toString。 我应该创建一个新的listmodel吗?我甚至无法扩展AbstractListModel,因为它使用toString 这是唯一的解决方案吗?

3 个答案:

答案 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)

  

我应该迭代它并进行比较   名称?听起来很糟糕。

非常糟糕。您可以要求所选项目的索引,因此您无需进行比较,但可以立即获取正确的对象。问题是这种快速而肮脏的方法是否足够好。正如您已经提到的,新的列表模型将是“干净”的解决方案。