Как переместить кнопку после выполненного действия? - PullRequest
0 голосов
/ 28 октября 2019

Я работаю над программой, использующей GridLayout. У меня проблема, когда я пытаюсь переместить кнопку в другое положение после выполненного действия. По сути, у меня есть пустое место на панели размером с кнопку. И я хочу переместить кнопку, нажатую в это пустое пространство, наоборот, пустое место займет место этой кнопки. Я использую массив, чтобы получить модель, которая выглядит как рамка. Итак, я знаю, где в моем массиве находится пустое пространство (которое является нулевым значением в массиве JButton), и я пытаюсь, чтобы эта кнопка заняла позицию пустого пространства в массиве и обратно. Но это на самом деле не работает.

Любая помощь будет оценена.

private void setGame(int nbLines, int nbRows, int emptyX, int emptyY) {
    pane.removeAll();
    for (int i = 0; i < model.length; i++) {
        for (int j = 0; j < model[i].length; j++) {
            if (!(j == emptyY && emptyX == i)) {
                button = new JButton("A");
                model[i][j] = button;
                pane.add(model[i][j]);
                model[i][j].addActionListener(this);
            }
        }
    }
    frame.add(pane);
    frame.setVisible(true);
}

public void actionPerformed(ActionEvent e) {
    for (int i = 0; i < model.length; i++) {
        for (int j = 0; j < model[i].length; j++) {
            if (e.getSource() == model[i][j]) {
                System.out.println("Cordonnées de i : " + i + "Cordonnées de j : " + j);
                model[i][j] = null;

                setGame(nbLignes, nbCol, i, j);
            }
        }
    }
}

1 Ответ

1 голос
/ 28 октября 2019

По сути, у меня на панели пустое место размером с кнопку.

Пустого места не может быть. Вам нужно добавить фактический компонент на панель, чтобы заполнить пространство в GridLayout.

Поэтому я бы посоветовал вам сделать что-то вроде:

  1. Добавить все кнопки в GridLayout
  2. Генерация случайного числа, чтобы определить, какая ячейка должна быть пустой. Сохраните это значение как «пустую ячейку». Затем вы используете Container.remove(...), чтобы удалить кнопку в этой ячейке. Затем вы используете метод Container.add(component, index), чтобы добавить JLabel без текста, чтобы заполнить пустую ячейку.
  3. Затем, когда вы нажимаете кнопку, вы перебираете все компоненты на панели, используя метод Container.getCompnent(...), поканайти индекс кнопки, которая была нажата.
  4. Теперь у вас есть два индекса: пустая ячейка и ячейка, по которой щелкнули. Затем вы используете методы remove (...) и add (...), чтобы поменять местами два компонента.
  5. Когда своп закончен, вы обновляете "пустой индекс", чтобы он стал значением "clicked"index ".
...