Java JList-关于toString()演示文稿的设计问题

Java JList-关于toString()演示文稿的设计问题,java,swing,jlist,Java,Swing,Jlist,我正在与JList合作,遇到了一些设计问题。 我想要的是一个gui组件,它提供一个列表,并允许用户从中添加或删除值 所以我创建了一个类,它接收一个列表 List<? exteds IDisplayable> 这是因为我不希望它显示toString()。所以我添加了一个方法 现在我的问题是如何将列表返回到调用它的gui表单。 我应该迭代它并按名称进行比较吗?这听起来很糟糕 我想我需要将对象放入我的ListModel中,但显示一个不同的toString。 我应该创建一个新的listm

我正在与JList合作,遇到了一些设计问题。 我想要的是一个gui组件,它提供一个列表,并允许用户从中添加或删除值

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

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

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

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

我应该迭代它并通过 名称听起来很糟糕


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

您可以创建一个包含IDisplayable对象的包装器对象,并实现一个toString()方法,该方法只调用IDisplayable对象上的getDisplayString()。可能没有那么好,但可能比创建自己的列表模型要好

编辑:不知道为什么一开始没有出现这个问题。但它似乎是您真正需要的
ListCellRenderer

如前所述,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在其所有集合组件中支持统一的字符串表示。该方法的全部功能在排序/筛选/搜索时显示出来:所有这些功能都自动使用自定义字符串表示,即默认情况下,用户根据所看到的内容进行排序/筛选/搜索-开发人员无需额外努力:-)

是,但-getElementAt正在返回一个对象。所以我仍然有一个问题,它在哪里使用对象来字符串。我不想让他那样做。我希望它显示我的方法displayString()。它还显示了其他内容。这里的注意事项相同-listmodel为getElementAt返回了一个对象,而我仍然存在toString()的相同问题。我必须说,您建议的解决方案,尽管是akward,是一个非常好的解决方案(尽管如此,swing并没有什么好写的)。@user450602,我认为您还应该研究ListCellRenderer,我已经更新了我的答案。这是正确的答案。忘得一干二净。恨荡秋千:-)。10x@user450602“我讨厌xx”这样的评论通常是由不太了解xx的开发人员发表的;-)你应该读一本教程;-)
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));