重新创建JButton后,actionListener不起作用

时间:2019-05-13 10:48:34

标签: java arrays swing jbutton actionlistener

我正在编写UNO纸牌游戏,我创建了一个带有大小会变化的JButton的数组,JButton代表玩家的手牌以及其中的所有不同牌。首次创建按钮时,一切正常,但是当我添加一张卡并扩展数组时,按钮actionListener损坏了。我认为当第二次创建按钮时,actionListners是在本地而不是全局创建的。我不知道如何解决该问题,所以请帮忙! xd

// playerHandButtons = the array with the buttons that is recreated
// playerHand = a stack that contains the players cards in the hand
// when the array is created for the first time

JButton [] playerHandButtons = new JButton[7]; 
// you start with 7 cards
public void createArray() {

        JButton[] playerHandButtons = new JButton[playerHand.size()];

        for (int i = 0; i < playerHandButtons .length; i++) {
            playerHandButtons [i] = new JButton("" + playerHand.elementAt(i));
            player.add(playerHandButtons [i]);
            playerHandButtons [i].addActionListener(this);
        }
    }
//  player = is the panel that displays all the cards

    public void createHand() {

        player.removeAll();
        player.repaint();
        player.revalidate();

        JButton[] playerHandButtons = new JButton[playerHand.size()];

        for (int i = 0; i < playerHandButtons .length; i++) {
            playerHandButtons [i] = new JButton("" + playerHand.elementAt(i));
            player.add(playerHandButtons [i]);
            playerHandButtons [i].addActionListener(this);
        }
    }

1 个答案:

答案 0 :(得分:0)

您的代码存在一些问题。

令我惊讶的是,即使是第一次,该代码也可能起作用,因为JButton[] playerHandButtons = new JButton[playerHand.size()];方法中的createArray()创建了一个本地变量,该变量应在您离开该方法后立即进行垃圾回收

如果要保留对创建的 buttons 的引用,则只需使用playerHandButtons = new JButton[playerHand.size()];,它将为字段playerHandButtons分配一个新数组。

createHand()方法也要这样做。

也可能有其他解决方案,但是很大程度上取决于 listener 类。