我的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方法,但这似乎是一个很大的冗余。如果有人知道另一种方式,我很乐意听取你的意见。
干杯
答案 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();
}
}