Доступ к хранимой переменной через JButton - PullRequest
0 голосов
/ 14 апреля 2020

Я работаю над пользовательским интерфейсом инвентаря для своей игры, и я застрял в этой проблеме в течение последнего дня. Я приложу все усилия, чтобы объяснить проблему как можно яснее.

У меня есть для 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 моей программы полностью отключена или есть шанс, что это может сработать? Я просто выбрал фрагменты кода, которые, по моему мнению, были бы уместны, но если чего-то не хватает, я могу загрузить больше.

1 Ответ

0 голосов
/ 14 апреля 2020

Мне удалось выяснить это!

useItem.addActionListener(new ActionListener() {

                public void actionPerformed(ActionEvent e) {
                    JButton item = (JButton) e.getSource();
                    InventoryClicks gc = new InventoryClicks(this, item.hashCode());
                    if (inGameInventoryListener != null) {
                        inGameInventoryListener.formEventOccurred(gc);
                    }   

                }

            });

Я получил источник правильной кнопки из e.getSource и скопировал ее в новую кнопку, из которой я затем извлек хэш-код.

        inventoryBag.SetInGameInventoryListener(new InGameInventoryListener() {

            @Override
            public void formEventOccurred(InventoryClicks c) {

                System.out.println(buttonIndex.get(c.getID()));
            }

        });

Затем я мог бы извлечь хеш-код из моего инвентаризатора и использовать его для поиска правильного идентификатора из моей хэш-карты (buttonIndex).

...