actionListener не работает после воссоздания JButton - PullRequest
0 голосов
/ 13 мая 2019

Я кодирую карточную игру UNO, я создал массив с JButtons, размер которого будет изменяться, JButtons представляют руку игрока и все различные карты в ней. Когда кнопки создаются в первый раз, все работает, но когда я добавляю одну карту и расширяю массив, кнопки 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 голосов
/ 13 мая 2019

Есть несколько проблем с вашим кодом.

Меня удивляет, что даже в первый раз этот код может работать, потому что JButton[] playerHandButtons = new JButton[playerHand.size()]; в методе createArray() создает локальную переменную, которая должна бытьПраво на сборку мусора, как только вы выйдете из метода.

Если вы хотите сохранить ссылку на кнопок , которые вы создаете, вы должны просто использовать playerHandButtons = new JButton[playerHand.size()];, который назначит новый массив дляполе playerHandButtons.

То же самое относится и к методу createHand().

Могут быть и другие решения, но многое зависит от класса listener .

...