-1

我的 Main 类和 Player 类中有两个 JList 和一个 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 方法并返回其中的任何内容。例如

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

这对我的第一个 JList 'listItemsShop' 来说很好,但对于我的第二个 JList,我不想显示价格。第二个 JList 是一个库存,因此该项目已被购买.. 我只想显示项目名称,也许还有一些其他详细信息,例如损坏量或状况..

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

干杯

4

2 回答 2

1

不要使用 JList。而是使用 JTable。然后您可以控制要显示的列。有关详细信息,请参阅如何使用表格

于 2013-05-23T15:08:26.703 回答
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();
   }
}
于 2013-05-23T09:40:59.593 回答