как может быть, что мое поле класса изменяется, хотя оно определено как статическое? - PullRequest
0 голосов
/ 17 января 2012

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

Теперь моя программа о матче двух команд шахматистов.Он прогнозирует оценки в зависимости от настроек игрока, выбранных тренером (пользователем).* (дополнительная информация ниже моего вопроса)

Поэтому я сначала спрашиваю пользователя, какие игроки входят в его команду.Конечно, я хочу, чтобы эта информация «PlayerList» оставалась постоянной (и ошибка, о которой я говорил, заключается в том, что она таинственным образом не существует)

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

Теперь проблема в том, что если пользователь заменил, например, Марселя на доске 2 на кого-то другого, то, когда пользователь собирается нажать кнопку на доске 3, у него больше не будет опций Марселя наего распоряжение.Поле «playerList» всех кнопок было установлено на выбранную настройку проигрывателя в основной программе, а не на исходный список, который основная программа запрашивала у пользователя в начале выполнения ...

(см. прилагаемое изображение) enter image description here

Таким образом, существует некоторая действительно раздражающая зависимость между игроками, которые назначены на эти кнопки, и фактически выбранным списком игроков, который был составлен пользователем.Если я посмотрю на свой код, я не пойму, почему ...

Так что что-то не так с кнопками, которые я определил.

вот что мы получили:

Я расширил JButton, чтобы на кнопке была информация о доступных игроках в команде пользователей, например:

    public class JButtonPlus extends JButton {
public Team team;
private int aantalSpelers;
final ArrayList<Player> playerList;
private Integer spelerNr;
private Integer bordNr;


public JButtonPlus(ArrayList<Player>playerList_, Integer spelernr, Integer bordnr){

    playerList=playerList_;
    aantalSpelers=playerList_.size();
    spelerNr=spelernr;
    bordNr = bordnr;
}

Итак, проблема в том, что этот окончательный ArrayList playerList не является постоянным вообще.

Он изменяется после вызова любого из actionListeners, нажав любую из других кнопок.

Это код в основной программе, который создает кнопки и добавляет actionlisteners: (примечание: это команды.get (0) относится к команде пользователя, а полевые игроки ссылаются на ArrayList, который заполняется всеми игроками, которые он отправил в программу. Метод displaySpelernr (i) добавляет имя игрока в метод setText JButtonPlus)

Box verticalBox_1 = Box.createVerticalBox();
    frame.getContentPane().add(verticalBox_1);

    JLabel lblNewLabel = new JLabel("opstelling thuisteam");
    verticalBox_1.add(lblNewLabel);

    for (int i = 0; i < teams.get(0).players.size(); i++) {
        final JButtonPlus btnSpeler = new JButtonPlus(
                teams.get(0).players,i, i);

        btnSpeler.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent arg0) {
                btnSpeler.displayVolgendeSpeler();

            }
        });
        verticalBox_1.add(btnSpeler);
        btnSpeler.displaySpelerNr(i);
    }

метод, который вызывается в userClick, displayVolgendeSpeler похож на это

    public void displayVolgendeSpeler(){
spelerNr =(spelerNr+1)%aantalSpelers;
    displaySpelerNr(spelerNr);      

проблема выше оператора, другие операторы касаются вычисления, которое работает так, как должно.Этот метод displaySpelerNr () выглядит как его

public void displaySpelerNr(Integer i){ setText(playerList.get(i).SpelerNaam); , и здесь замечена ошибка: объект playerList был изменен ..

Кто-нибудь видит, почему этот предположительно постоянный источник игроков playerList изменяетсякогда нажимается кнопка?

* (дополнительная информация о фоне)В матче между двумя шахматными командами все игроки должны сыграть 1 матч против одного из игроков соперника.Как правило, игроки в команде имеют разную силу.Так, например, если у вас есть команда A с силой игрока от новичка до мастера и команда B с игроками от среднего до гроссмейстера, вы знаете, что если вы объедините игроков в группу с ростом силы, то команда A наверняка проиграет.Веселье начинается, когда Команда A пожертвует одним или двумя из своих самых слабых игроков, соединяя их с двумя сильнейшими игроками команды B. Это означает потерю двух очков, но каждый из оставшихся игроков команды A теперь будет сталкиваться с более слабым игроком.более сильного.Могут даже быть пары, так что более слабая команда победит.Моя программа пытается показать, какие пары худшие и лучшие, и выдает статистику.Конечно, было бы неплохо, если бы тренер, который мог бы использовать эту программу, действительно мог настроить этот Gui на свою желаемую команду, и вот куда вы входите, дорогой StackOverflow-champ!

1 Ответ

1 голос
/ 17 января 2012

Объявление поля как final означает, что вы не можете присвоить ему новое значение.Однако, если это поле содержит объект, вы все равно можете изменить неокончательные поля внутри этого объекта.Код ниже должен проиллюстрировать, что я имею в виду.

class Foo {
    private final Bar foo; 

    public Foo() {
        foo = new Bar();
    }

    public void testFoo() {
        this.foo = new Bar(); // compile error
        this.foo.setBar("Test"); // works fine
    }
}

class Bar {
    private String bar;

    public void setBar(String bar) {
        this.bar = bar;
    }

    public String getBar() {
        return bar;
    }
}

В вашем коде у вас есть final ArrayList<Player>, что означает, что вы не можете сохранить new ArrayList в этом поле.Однако вы можете изменить содержимое существующего ArrayList любым из обычных способов (добавление, удаление, обновление элементов и т. Д.).

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

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