Почему мой слушатель действия не отображает правильное изображение при нажатии? - PullRequest
0 голосов
/ 16 января 2020

Я сейчас пытаюсь написать игру на совпадение. Я создал 2-й массив для JButton и ImageIcon. Я сделал перетасовывающее имя класса Shuffle, этот класс перетасовывает позицию ImageIcon в своем массиве. При запуске игры без базовых карт карты кажутся перемешанными. Но когда я запускаю игру с базовыми картами и включаю слушателя действий, когда вы нажимаете на карту, изображение отсутствует. Если бы кто-то мог помочь мне разобраться с этой проблемой, это было бы очень признательно

Рассмотрим этот код:

Метод для кадра:

void game() {
        Shuffle shuffle = new Shuffle();
        shuffle.random2();
        ImageIcon base = new ImageIcon("images/BaseCard.png");
        int x = 60;
        int y = 20;
        JFrame frame = obj.frame();
        JLabel label = obj.label();
        for (int i = 0; i < cards.length; ++i) {
            for (int j = 0; j < cards[i].length; ++j) {
                cards[i][j] = obj.Comp(base);
                cards[i][j].addActionListener(new Clicked(i, j));
                cards[i][j].setBounds(x, y, 90, 126);
                y = y + 135;
                if (y >= 540) {
                    y = 20;
                    x = x + 120;
                }
                frame.add(cards[i][j]);
            }
        }

        frame.add(label);
        frame.setLayout(null);
        frame.setVisible(true);
    }
}

Это класс Shuffle:

class Shuffle {

    Matching obj = new Matching();
    String peach = "images/peach.png";
    String daisy = "images/Baby_daisy.png";
    String luigi = "images/Baby_Luigi.png";
    String waluigi = "images/Baby_Waluigi.png";
    String wario = "images/Baby_Wario.png";
    String bowser = "images/BabyBowser.png";
    String drybones = "images/DryBones.png";
    String shyguy = "images/ShyGuy.png";

    String[][] images = {
        {peach, daisy, luigi, waluigi},
        {wario, bowser, drybones, shyguy},
        {peach, daisy, luigi, waluigi},
        {wario, bowser, drybones, shyguy}
    };

    ImageIcon Icons[][] = new ImageIcon[4][4];

    void random2() {

        for (int i = 0; i < images.length; i++) {
            for (int j = 0; j < images[i].length; j++) {
                int i1 = (int) (Math.random() * images.length);
                int j1 = (int) (Math.random() * images[i].length);

                String temp = images[i][j];
                images[i][j] = images[i1][j1];
                images[i1][j1] = temp;
            }
        }

        for (int i = 0; i < images.length; i++) {
            for (int j = 0; j < images[i].length; j++) {
                Icons[i][j] = new ImageIcon(images[i][j]);
            }
        }

    }
}

И это действие Слушатель

class Clicked implements ActionListener {

    Shuffle shuffle = new Shuffle();
    Matching matching = new Matching();
    private int i;
    private int j;

    public Clicked(int i, int j) {
        this.i = i;
        this.j = j;

    }

    public void actionPerformed(ActionEvent e) {
        JToggleButton tBtn = (JToggleButton) e.getSource();
        if (tBtn.isSelected()) {
            System.out.println("click");
            tBtn.setIcon(shuffle.Icons[i][j]);
        } else {
            System.out.println("not");
            tBtn.setIcon(new ImageIcon("images/BaseCard.png"));
        }

    }

}

1 Ответ

0 голосов
/ 16 января 2020

В вашем классе Clicked вы создаете новую Shuffle вместо:

public Clicked(Shuffle shuffle) {
    this.shuffle = shuffle;
}

, которая даст вам ранее созданную и перемешанную «колоду» карт. Вы также можете захотеть изучить только наличие Clicked и использовать его для всех карт, просто следите за любыми проблемами с потоками, если вы начнете менять Shuffle.

...