JList toArray方法 - 在单独的JList中显示有关单个类的不同信息

时间:2013-05-23 09:05:17

标签: java swing jlist tostring

我的Main Class和我的Player类中有两个JLists和一个ArrayList项目

  private ArrayList<Item> allItems= new ArrayList<Item>();

  listItemsShop= new JList(allItems.toArray());

  listItemsInv= new JList(currentPlayer.getAllItems().toArray());

正如大多数人可能知道的那样,toArray方法将我的集合'allItems'的内容作为数组返回。这使它能够在JList组件中使用。

JList组件然后调用我的Items类toString方法并返回whatevers。例如

    @Override
public String toString() {
    return  name + "," + "$"+price;
}

这对我的第一个JList'listItemsShop'来说很好,但对于我的第二个JList,我不想显示价格。第二个JList是一个库存,所以物品已被购买..我只想显示物品名称,也许还有一些其他细节,如损坏数量或条件......

有没有人知道如何做到这一点?我读过有人创建一个重复的类并以这种方式覆盖第二个类toString方法,但这似乎是一个很大的冗余。如果有人知道另一种方式,我很乐意听取你的意见。

干杯

2 个答案:

答案 0 :(得分:1)

不要使用JList。而是使用JTable。然后,您可以控制要显示的列。有关详细信息,请参阅How to Use Tables

答案 1 :(得分:0)

编辑:抱歉,我误解了你的问题。正如垃圾桶建议的那样,最好使用细胞渲染器:

public class ItemCellRenderer extends DefaultListCellRenderer {
   public static enum Type {SHOP, INVENTORY;}

   private Type type;

   public ItemCellRenderer(Type t) {
      super();
      this.type = t;
   }

   @Override
   public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
      JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
      Item item = (Item) value;
      if (type == Type.SHOP) {
         label.setText(item.getPrice());
      } else if (type == Type.INVENTORY) {
         label.setText(item.getData());
      } else {
         label.setText(null);
      }
      return label;
   }
}

您可以这样使用它:

listItemsShop.setCellRenderer(new ItemCellRenderer(ItemCellRenderer.Type.SHOP));
listItemsInv.setCellRenderer(new ItemCellRenderer(ItemCellRenderer.Type.INVENTORY));

<强>较旧

我认为最好将字符串方法委托给库存/商店,而不是在项目类中对其进行编码。像

class Inventory {
   public String toString(Item item) {
      return item.getName() + " " + item.getStats();
   }
}

和商店

class Shop {
   public String toString(Item item) {
      return item.getName() + " $" + item.getPrice();
   }
}