gpt4 book ai didi

java - 通过 JButton 访问存储的变量

转载 作者:行者123 更新时间:2023-12-01 17:26:14 24 4
gpt4 key购买 nike

我正在为我的游戏开发库存 UI,过去一天我一直被这个问题困扰,我会尽力尽可能清楚地解释这个问题。

我有一个 for 循环,它为我的库存 UI 创建行,它添加与库存中的项目一样多的行。由于在任何给定时间库存中可能存在不同数量的独特元素,因此必须保持灵 active 。

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);

然而,我面临的问题是添加到我的按钮的 Action 监听器最终在我的 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()));
}

});

我觉得只要我能够从 inventoryClicks 的来源获得正确的 key , 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;

}

我希望我能够稍微体面地解释我的问题,我的程序的逻辑是否完全关闭或者是否有可能起作用?我只是挑选了一些我认为相关的代码,但如果缺少某些内容,我可以上传更多内容。

最佳答案

我设法弄清楚了!

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 获取了正确按钮的源代码,并将其复制到一个新按钮,然后从中提取了 hashCode。

        inventoryBag.SetInGameInventoryListener(new InGameInventoryListener() {

@Override
public void formEventOccurred(InventoryClicks c) {

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

});

然后,我可以在 inventoryListener 中提取哈希码,并使用它从 hashmap(buttonIndex) 中查找正确的 ID。

关于java - 通过 JButton 访问存储的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61205538/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com