Как запустить метод из другого класса при нажатии кнопки? - PullRequest
0 голосов
/ 25 мая 2019

Я создаю программу TicTacToe для проекта Java. Я использую Swing с панелью 3x3 в качестве графического интерфейса и интегрирую кнопки в каждом окне, чтобы пользователь мог щелкнуть. Проблема в том, что я не знаю, как запустить метод WinCondition (то есть, когда пользователь получает 3 подряд). Я не могу вызвать его для метода actionPerformed в классе кнопки, и я не знаю, где еще это было бы целесообразно вызвать.

У меня есть два класса, один - класс кнопок, а другой - настоящая игра, которая создает панель для пользователя.

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

public class TicTacGame extends JFrame{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    JPanel p = new JPanel();
    XOButton[] buttons = new XOButton[9];

    public TicTacGame() {
        super("TicTacToe");
        setSize(400,400);
        setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        p.setLayout(new GridLayout(3,3));
        for(int i = 0; i < 9; i++) {
            buttons[i] = new XOButton();
            p.add(buttons[i]);
        }
        add(p);

        setVisible(true);

        }

    public int winCondition() {

        //I have left out the win condition method so this box doesn't get unnecessarily long
    }


    public static void main(String[] args) {
        TicTacGame ttg = new TicTacGame();

    }
}
public class XOButton extends JButton implements ActionListener{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    ImageIcon X;
    ImageIcon O;
    //0 is nothing, 1 is X, 2 is O
    int value = 0;
    public static int turn = 1;


    public XOButton() {
        X = new ImageIcon(this.getClass().getResource("X.png"));
        O = new ImageIcon(this.getClass().getResource("O.png"));
        addActionListener(this);
    }

    public int getValue() {
        return this.value;
    }

    public void actionPerformed(ActionEvent e) {
        if(turn >= 5) {
            int win = ttg.winCondition();
        }

        if(turn % 2 == 0) {
            value += 2;
            turn++;
        }
        else {
            value++;
            turn++;
        }
        value %= 3;
        switch(value) {
            case 0:
                setIcon(null);
                break;
            case 1:
                setIcon(X);
                removeActionListener(this);
                break;
            case 2:
                setIcon(O);
                removeActionListener(this);
                break;
        }
    }

}

Я ожидаю, что при каждом нажатии кнопки выполняется метод winCondition (), чтобы проверить, выиграл пользователь или нет.

1 Ответ

0 голосов
/ 25 мая 2019

существует множество способов сделать это, один из них

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

1) вы можете передать ссылку из класса TicTacGame в класс XOButton в конструкторе .. так, чтобы у вас был доступ к любой другой функции в классе TicTacGame

2) вы можете использовать интерфейсы .... и т. Д.

...