Как сделать так, чтобы кнопки менялись на разные количества кликов java - PullRequest
0 голосов
/ 30 апреля 2018

Я пытаюсь создать игру в Java, где если вы нажимаете на кнопку, когда она становится красной, а если вы нажимаете на нее дважды, она становится синей, но я сталкиваюсь с проблемой, когда я нажимаю один квадрат один раз и он становится красным, если я щелкаю по другому, когда он становится синим, когда я хочу, чтобы эффект был изолирован для каждого квадрата за раз (например, если я щелкаю по одному квадрату один раз по его красному, щелкаю по другому два раза по синему, а другой - по красному) , Я также хочу сбросить его после 3-х нажатий.

Вот мой слушатель действий пока что

JFrame frame = new JFrame(); //creates frame
JButton[][] grid; //names the grid of buttons

int clicked = 0;

public ButtonGrid(int width, int length) { //constructor
    frame.setLayout(new GridLayout(width, length)); //set layout
    grid = new JButton[width][length]; //allocate the size of grid
    for(int y = 0; y < length; y++) {
        for(int x = 0; x < width; x++) {
            grid[x][y] = new JButton(); //creates a button
            grid[x][y].addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        if(clicked == 0) {
        ((JButton)e.getSource()).setBackground(Color.red);
                            clicked++;
                        } else if(clicked == 1) {
        ((JButton)e.getSource()).setBackground(Color.blue);
                            clicked++;
                        }
                    }
            });
            frame.add(grid[x][y]); //adds new button to grid
        }
    }
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack(); //sets appropriate size for frame
    frame.setVisible(true); //makes frame visible
// ...
}

Ответы [ 3 ]

0 голосов
/ 30 апреля 2018

Ваша проблема в том, что clicked прикреплен к рамке, а не к кнопке. Это означает, что для всего приложения есть только одно значение clicked.

Самое простое, что можно сделать здесь, это написать новый класс GregoryWeigelButton (или любой другой), который extends JButton и содержит int clicked=0 внутри (и, вероятно, геттер и сеттер). Затем просто проверьте значение clicked для этой конкретной кнопки .

0 голосов
/ 30 апреля 2018

В вашей текущей реализации clicked - это поле экземпляра родительского класса, которое используют все ваши кнопки / ActionListener s.

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

Теперь вы можете создать пользовательский класс, который extends из JButton, но, ИМХО, это немного неуклюже и запирает вас в одном случае использования. Лично я хотел бы реализовать конкретную реализацию ActionListener для обеспечения этого побочного эффекта.

Например ...

public class CounterActionListener implements ActionListener {
    private int counter;

    @Override
    public void actionPerformed(ActionEvent e) {
        Object source = e.getSource();
        if (source instanceof JButton) {
            JButton button = (JButton)source;
            clicked++;
            if(clicked == 0) {
                button.setBackground(Color.red);
            } else if(clicked == 1){
                button.setBackground(Color.blue);
            }
        }
    }
}

Затем в своем коде вы просто применяете слушателя к кнопке, например ...

grid[x][y] = new JButton(new CounterActionListener());

Вы могли бы также следовать этому, используя «делегат», который фактически выполнял требуемые операции, основываясь на количестве нажатий, которые можно удерживать в модели, но это выходит за рамки вопроса;)

0 голосов
/ 30 апреля 2018

У вас есть один глобальный клик для всех из них. Из-за этого действия не являются изолированными.

int clicked = 0;

Не должен быть в классе.

...