Почему мой цикл поиска объекта в массиве работает только в первый раз? - PullRequest
1 голос
/ 15 июня 2011

Я создаю программу, которая отображает несколько баз и количество войск на каждой базе. Есть два типа баз, дружественные и вражеские базы. Каждая база расширяет GCompound и состоит из GRect и GLabel (для отображения количества войск). Для отслеживания баз используются два массива: один для дружественных, один для врагов.

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

Моя проблема в настоящее время в том, что я могу определить только основание, на котором пользователь нажимает мышь, а не основание, на котором отпущена мышь. Я использую метод getElementAt из библиотеки ACM для возврата объекта GObject, над которым происходит действие мыши.

Код для нажатия мыши:

public void mousePressed(MouseEvent e){
    int mouseX = e.getX();
    int mouseY = e.getY();
    for(int i = 0; i < PlayerBaseArray.length; i++){
        if(getClickedObject(mouseX, mouseY) == PlayerBaseArray[i]){  //Checks to see if the clicked base is in the Array of friendly bases.
            pressedIndex = i;
            pressedBaseTroopCount = PlayerBaseArray[pressedIndex].getTroopCount();
        }
    }
}

Код для выпуска мыши:

public void mouseReleased(MouseEvent m){
    int mouseX = m.getX();
    int mouseY = m.getY();
    for(int i = 0; i < PlayerBaseArray.length; i++){
        if(getClickedObject(mouseX, mouseY) == PlayerBaseArray[i]){ // This is always false for some reason.
            PlayerBaseArray[i].changeTroopCount(pressedBaseTroopCount);
            PlayerBaseArray[pressedIndex].changeTroopCount(-pressedBaseTroopCount);
        }
    }
} 

Способ узнать, на каком объекте щелкнули:

    private GObject getClickedObject(int x, int y){
    GObject clicked = getElementAt(x, y);
    if(clicked == null) return null;
    else return clicked;
}

По какой-то причине оператор if в mouseReleased() никогда не верен, даже если он правильно работает в mousePressed(). Любая идея о том, почему оператор if в mouseReleased() не работает?

Я пытался исследовать проблему безрезультатно, и вместо того, чтобы тратить на нее еще одну ночь, я подумал, что задам вопрос здесь. Спасибо!

1 Ответ

0 голосов
/ 15 июня 2011

Вы не должны использовать оператор == для сравнения Objects.Вы должны использовать метод .equals():

if (getClickedObject(mouseX, mouseY).equals(PlayerBaseArray[i]))

Проще говоря, вы можете использовать == только при сравнении примитивов Java (например, int, long и т. Д.).

Для всех "обычных" объектов всегда используйте objecta.equals(objectb).

В этой статье этот вопрос обсуждается более подробно.

Внимание анальное сохранение :

Да, вы правы, при некоторых обстоятельствах вы можете безопасно использовать == между объектами, такими как строковые константы, целые числа от -128 до 127 и т. Д., И т. Д.Но этому парню нужен был четкий ответ, и его не следует путать.Пожалуйста, не поддавайтесь искушению комментировать об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...