Почему слушатель не привязан к объекту, которому я его назначаю?

#java #libgdx #listener #event-listener #hashcode

Вопрос:

 for (int i = 0; i < mapSize[0]; i  ) {
    for (int j = 0; j < mapSize[1]; j  ) {
        hashCodes[i][j] = new Image(emptyField);
        int[] targetField = new int[2];
        targetField[0] = i;
        targetField[1] = j;
        hashCodes[i][j].addListener(new InputListener() {
            @Override
            public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
                return true;
            }

            @Override
            public void touchUp(InputEvent event, float x, float y, int pointer, int button) {
                System.out.println("Empty Field clicked"   Arrays.toString(targetField));
                for (Image[] imageRow : hashCodes) {
                    for (Image actualImage : imageRow) {
                        System.out.print(actualImage.hashCode()   " ");
                    }
                    System.out.println();
                }
                if (MarvelousMashup.useInfinityStone) {
                    MarvelousMashup.useInfinityStone = false;
                    MainMenu.client.getMessageHandler().sendUseInfinityStoneRequest
                            (MarvelousMashup.activeCharacter,
                                    getActualEntity(MarvelousMashup.activeCharacter).getPosition(),
                                    targetField,
                                    getStone(MarvelousMashup.useInfinityStoneID));
                }
            }
        });
        tempField.addActor(hashCodes[i][j]);
    }
}
 

Я назначаю слушателя каждому Актеру. Но независимо от того, какое пустое поле я щелкаю, нажатое поле остается для меня все тем же каждый раз, хотя каждый Актер является другим.

 Empty Field clicked[5, 5]
817686795 1047478056 2115628016 611643685 1935122449 872826668 
91323447 110053477 1209411469 1320105604 1076984738 1006751649 
1171434979 1920907467 970535245 194481424 1534755892 1548081008 
753321708 464400749 343563528 1719072416 2092801316 376635015 
1344697180 28597262 300983713 284686302 1940445711 1356840024 
1142347343 1810923540 1581078471 1932332324 33233312 1860491691 
 

Я делаю что-то не так? Потому что, насколько я понимаю, у каждого актера должен быть свой собственный слушатель, а не один и тот же слушатель.

Комментарии:

1. Почему вы говорите, что у каждого актера свой слушатель? Для меня они все выглядят одинаково. Что вы видите, что приводит вас к выводу, что актеры одинаковы? Здесь мы видим результат только одного слушателя. Что должно быть по-другому? Что вы делаете в коде, который делает каждого слушателя другим?

2. @markspace Я добавляю новое изображение в 2d-массив и назначаю им слушателя. В то время как, по сути, все слушатели должны делать одно и то же, что должно быть в них по-другому, так это targetField . И всякий раз, когда я создаю новое изображение, я добавляю к нему нового слушателя с новым целевым полем. Тем не менее целевое поле для всех моих слушателей-это самое последнее, которое было назначено.

3. @markspace Я также должен добавить, что по какой-то причине каждое изображение, добавляемое в поле, имеет один и тот же хэш-код, даже если я добавляю только что созданное изображение в конце.

4. И targetField является ли локальная переменная? Вы не изменили код, когда разместили его здесь? Я удивлен, что Java позволяет вам это делать, она явно сломана. Создайте targetField поле внутри прослушивателя и назначьте его, передав необходимые параметры в конструкторе.

5. Существует ли другая targetField переменная (возможно, предшествующая final ), объявленная перед циклом for? Это единственный способ, которым я мог видеть компиляцию этого кода.

Ответ №1:

Попробуйте добавить targetField его непосредственно в прослушиватель и инициализировать с помощью конструктора.

 for (int i = 0; i < mapSize[0]; i  ) {
    for (int j = 0; j < mapSize[1]; j  ) {
        hashCodes[i][j] = new Image(emptyField);
        hashCodes[i][j].addListener( new MyInputListener( i, j ) );
// rest of code...


class MyInputListener extends InputListener {
    int [] targetField = new int[2];
    InputListener( int i, int j ) {
      targetField[0] = i;
      targetField[1] = j;
    }
    @Override
    public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
       return true;
    }

    @Override
    public void touchUp(  // etc...
 

Комментарии:

1. Это совсем не работает. Я не понимаю, почему вы позвонили class InputListener , но это просто приводит к ошибкам с моей стороны. Также new InputListener ( i, j ) не может работать, так как конструктор для класса InputListener не учитывает int.

2. Какой конструктор? Разве это не интерфейс? Какой API вы используете?

3. Прослушиватель ввода-это класс, возможно, вы думали о EventListener.

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