Я работаю над пользовательским интерфейсом инвентаря для своей игры, и я застрял в этой проблеме в течение последнего дня. Я приложу все усилия, чтобы объяснить проблему как можно яснее.
У меня есть для l oop, который создает строки для моего пользовательского интерфейса инвентаря, он добавляет столько строк, сколько элементов в инвентаре. Поскольку в любой момент времени в инвентаре может быть разное количество уникальных предметов, он должен быть гибким.
for (int i = 0; i < p1.getPi().getInventoryLength(); i++) {
itemID = (p1.getPi().generateItem(p1.getPi().getItemID(i)).getItemID());
///////// ITEM ICON ///////////
itemLabel = new JLabel(loadMenuIcon(p1.getPi().generateItem(p1.getPi().getItemID(i)).getIcon(), 20, 20));
gc.weightx = 0.1;
gc.weighty = (i+1 == p1.getPi().getInventoryLength()) ? 1 : 0;
gc.gridx = 0;
gc.gridy = i;
gc.fill = GridBagConstraints.HORIZONTAL;
gc.anchor = GridBagConstraints.FIRST_LINE_START;
gc.insets = new Insets(0, 0, 0, 0);
inventoryPanel.add(itemLabel, gc);
///////// ITEM NAME ///////////
name = new JTextField(p1.getPi().generateItem(p1.getPi().getItemID(i)).getItemName());
name.setBorder(null);
name.setEditable(false);
name.setHighlighter(null);
name.setFont(inGameFont.getFont());
gc.weightx = 0.7;
gc.weighty = 0;
gc.gridx = 1;
gc.gridy = i;
gc.fill = GridBagConstraints.HORIZONTAL;
gc.anchor = GridBagConstraints.FIRST_LINE_START;
gc.insets = new Insets(4, 0, 0, 0);
inventoryPanel.add(name, gc);
///////// ITEM COUNT ///////////
amount = new JTextField("x " + p1.getPi().getAmount(i));
amount.setBorder(null);
amount.setEditable(false);
amount.setHighlighter(null);
amount.setFont(inGameFont.getFont());
gc.weightx = 0.1;
gc.weighty = 0;
gc.gridx = 2;
gc.gridy = i;
gc.fill = GridBagConstraints.NONE;
gc.anchor = GridBagConstraints.FIRST_LINE_START;
gc.insets = new Insets(4, 0, 0, 0);
inventoryPanel.add(amount, gc);
///////// USE BUTTON ///////////
useItem = new JButton("Use");
useItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
InventoryClicks gc = new InventoryClicks(this, itemID);
if (inGameInventoryListener != null) {
inGameInventoryListener.formEventOccurred(gc);
}
}
});
useItem.setFont(inGameFont.getFont());
useItem.setHorizontalAlignment(SwingConstants.CENTER);
useItem.setPreferredSize(new Dimension(60, 18));
useItem.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, Color.LIGHT_GRAY));
gc.weightx = 0.1;
gc.weighty = 0;
gc.gridx = 3;
gc.gridy = i;
gc.fill = GridBagConstraints.REMAINDER;
gc.anchor = GridBagConstraints.FIRST_LINE_END;
gc.insets = new Insets(3, 0, 0, 0);
inventoryPanel.add(useItem, gc);
Однако проблема, с которой я сталкиваюсь, заключается в том, что добавляемый к моим кнопкам actionlistener все заканчивается одинаковыми значениями в моей переменной itemID. Это означает, что независимо от того, какую кнопку я нажимаю, я всегда получаю один и тот же конечный результат.
inventoryBag.SetInGameInventoryListener(new InGameInventoryListener() {
@Override
public void formEventOccurred(InventoryClicks c) {
System.out.println(c.getID());
}
});
Так я извлекаю информацию из нажатой кнопки.
Я пытался куча разных методов для хранения переменной itemID, но я всегда сталкиваюсь с одной и той же проблемой, когда я либо не могу получить доступ к правильной переменной, либо когда мне удается сохранить переменную, но я не могу получить доступ к ней в моем слушателе. Я попытался сохранить переменную itemID в hashmap вместе с хэш-кодом кнопки
private HashMap<Integer, Integer> buttonIndex;
public HashMap<Integer, Integer> getButtonIndex() {
return buttonIndex;
}
buttonIndex.put(useItem.hashCode(), itemID);
buttonIndex = inventoryBag.getButtonIndex();
inventoryBag.SetInGameInventoryListener(new InGameInventoryListener() {
@Override
public void formEventOccurred(InventoryClicks c) {
System.out.println(buttonIndex.get(c.getID()));
}
});
Мне кажется, что решение hashmap находится на правильном пути, если только я смогу получить правильный ключ только из источника инвентаризационных кликов.
public class InventoryClicks extends EventObject {
private int id;
public int getID() {
return this.id;
}
public InventoryClicks(Object source, int id) {
super(source);
this.id = id;
}
Надеюсь, мне удалось несколько прилично объяснить мою проблему, логика c моей программы полностью отключена или есть шанс, что это может сработать? Я просто выбрал фрагменты кода, которые, по моему мнению, были бы уместны, но если чего-то не хватает, я могу загрузить больше.