Получить источник? Как сохранить расположение кнопки в массиве? (Макет сетки)

Я создал Gridlayout из кнопок с двумерным массивом. Когда я нажимаю кнопку, я хочу выполнить метод из другого класса, которому нужны координаты нажатой кнопки. Я хочу сохранить эти числа в массиве.

int buttonCoordinates[2]

Я уже создал прослушиватель действий

jBTN_field[y][x].addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent pE) {

    }
}

Я хочу сохранить координаты в массиве.


person Samuel    schedule 06.05.2019    source источник
comment
Зачем тебе координаты? Этот массив будет хранить одно число, вы уверены, что это то, что вы хотите? А что вы пробовали? Этот пустой ActionListener ничего нам не говорит.   -  person Frakcool    schedule 06.05.2019
comment
@Frakcool Он должен хранить 2 числа. х и у.   -  person Samuel    schedule 06.05.2019
comment
Хорошо, я понимаю вашу точку зрения. И еще, что вы пробовали? Пожалуйста, опубликуйте правильный минимальный воспроизводимый пример, который показывает, что вы пробовали, и какие проблемы у вас возникли.   -  person Frakcool    schedule 06.05.2019
comment
Просто предложение, чтобы вы могли улучшить свой код. Почему бы не сделать класс class BtnCoordinates, в котором будут 2 переменные: int x, y;. Затем создайте массив BtnCoordinates: BtnCoordinates location = new BtnCoordinates[15];. Таким образом, вы сможете получить доступ к нужным вам координатам -› location[10].x. Но это всего лишь пример, и вы должны изменить то, как вы разработали свой код. Я предлагаю не использовать 2D-массив   -  person Soutzikevich    schedule 06.05.2019
comment
@Frakcool В actionPerformed я хочу выполнить метод с массивом в качестве параметров. Методу требуется расположение кнопки.   -  person Samuel    schedule 06.05.2019
comment
@the_hashtag Кроме того, если вы хотите просто передать x и y в качестве параметров, то почему вы используете анонимный внутренний класс? Создайте обычный класс, реализующий метод ActionListener и Override actionPerformed, чтобы добавить параметры Actionevent e, int x, int y. Затем вы можете передать новый класс, созданный вами, в качестве параметра при инициализации кнопок.   -  person Soutzikevich    schedule 06.05.2019
comment
Опять же, я понимаю, что вы пытаетесь сделать, но я думаю, что ваш подход не самый лучший, как уже указал @P.Soutzikevich, возможно, вам придется изменить способ, которым вы пытаетесь это сделать. Массив 1D/2D - это не то, что я бы сделал. Просто вызовите yourMethod(buttonCoordinates), и вы будете передавать свой массив в качестве аргумента, если вы не знаете, как заполнить массив: buttonCoordinates[0] = y и buttonCoordinates[1] = x. Кстати, почему у вас сначала y, а потом x? Это кажется неправильным. Если это не решит ваш вопрос, опубликуйте правильный минимально воспроизводимый пример   -  person Frakcool    schedule 06.05.2019
comment
Возможный дубликат Как создать метод, отключающий JButton?   -  person Frakcool    schedule 06.05.2019
comment
@Frakcool Я хочу сделать сетку слева направо   -  person Samuel    schedule 06.05.2019
comment
Вы получаете доступ к своим JButton другим способом, если вы получаете доступ к [y][x] вместо [x][y]. Проверьте повторяющийся вопрос и принятый ответ. Он содержит минимально воспроизводимый пример, который вы можете скопировать-вставить и увидеть там ту же программу. Затем просто измените его в соответствии с вашими потребностями. Без дополнительной информации мы не можем предоставить дополнительную помощь, и вы, похоже, отвечаете только на последний заданный вопрос, поэтому теперь вы сами по себе, если не воспользуетесь тур, перейдите на страницу Как спросить и опубликуйте MCVE   -  person Frakcool    schedule 06.05.2019


Ответы (1)


Не пытаясь пока изменить структуру вашей программы, вот «наивный» подход.

Вместо использования анонимного внутреннего класса, вы можете создать еще один класс:

public class MyListener implements ActionListener {

    private int x;
    private int y;

    public MyListener(int x, int y){
        this.x = x;
        this.y = y;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        //do something with this.x
        //do something with this.y
    }
}

а затем вы можете адаптировать это к своему коду:

jBTN_field[y][x].addActionListener(new MyListener(x, y));

Теперь для доступа к координате кнопки это будет так же просто, как:

button[y][x].

ПРИМЕЧАНИЕ

Ваш код не является логически неправильным. Я просто показываю вам альтернативу, которая может упростить вам задачу, чтобы вы могли решать свою проблему более методично. Пример, который я показал, подходит, если вы хотите иметь одинаковую actionPerformed() функциональность для всех кнопок. В противном случае более подходящим является анонимный внутренний класс.

В качестве альтернативы, если вы хотите сохранить свой код как есть, вы можете сделать:

jBTN_field[y][x].addActionListener(new ActionListener() {
    int x = "value_for_x", y = "value_for_y";

    @Override
    public void actionPerformed(ActionEvent pE) {
        //do something with x
        //do something with y
    }
}
person Soutzikevich    schedule 06.05.2019