JProgressBar не обновляет значение при использовании setValue (newValue)

Я использую JProgressBar в качестве полосы здоровья, поэтому я хочу вручную установить максимум и значение полос по ходу игры. Игра представляет собой игру про покемонов и позволяет вызывать новых покемонов. Эти новые покемоны могут иметь разные максимальные значения здоровья и текущие значения здоровья, поэтому я называю progressBar.setMaximum(newPokemonMaxHealth) и progressBar.setValue(currentPokemonHealth). Я даже звоню progressBar.repaint(), progressBar.revalidate() и progressBar.update(progressBar.getGraphics(), и ни один из них мне не помог.

Вот инициализация индикатора выполнения:

    UIManager.put("ProgressBar.selectionForeground", Color.BLACK);
    poke1Health = new JProgressBar(0);
    poke1Health.setMaximum(board.getTrainer1().getBattlingPokemon().getMaxHealth());
    poke1Health.setValue(board.getTrainer1().getBattlingPokemon().getCurrentHealth());

    poke1Health.setStringPainted(true);
    poke1Health.setForeground(Color.green);
    poke1Health.setBackground(Color.red);
    poke1Health.setPreferredSize(new Dimension(50, 10));
    centerPanel1.add(poke1Health);

Затем, когда я пытаюсь изменить максимум и значение:

            board.getTrainer1().pokemonChanged(1);
            poke1Health.setValue(board.getTrainer1().getPokemon(0).getCurrentHealth());
            poke1Health.setMaximum(board.getTrainer1().getPokemon(0).getMaxHealth());
            poke1Health.repaint();
            poke1Health.revalidate();
            poke1Health.update(poke1Health.getGraphics());

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

По какой-то причине значение баров не хочет меняться, а максимум меняется.

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

Покемон 1 Максимальное здоровье: 49

Покемон 2 Максимальное здоровье: 50

Покемон 1 Текущее здоровье: 49

Покемон 2 Текущее здоровье: 50

Затем я напечатал значение баров до и после того, как установил новый максимум и новое значение.

Количество баров до: 49

Количество баров после: 49

Бары Макс до: 49

Макс баров после: 50

По какой-то причине максимальное значение изменилось, но значение не изменилось. Распечатка, которую я сделал, чтобы получить текущее здоровье Pokemon 2, — это тот же код, который я использовал, чтобы установить новое значение полосы. Здесь:

 poke1Health.setValue(board.getTrainer1().getBattlingPokemon().getCurrentHealth());

 System.out.println("Pokemon 2 Current Health: " + board.getTrainer1().getBattlingPokemon().getCurrentHealth());

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

Спасибо!


person Cole    schedule 05.12.2016    source источник
comment
Вероятно, вам повезет получить достойный ответ, если вы опубликуете минимально воспроизводимый код примера с вашим вопросом - небольшой компилируемая исполняемая примерная программа, которая демонстрирует нам вашу проблему. Это не вся ваша программа, и, опять же, она невелика, но достаточно мала, чтобы полностью опубликовать текст в формате кода в вашем вопросе. Он снова запускается — имеет основной метод, импорт и все, что нужно для компиляции.   -  person Hovercraft Full Of Eels    schedule 06.12.2016
comment
Фактический код очень большой! Я попробовал это: import java.awt.FlowLayout; import javax.swing.JProgressBar; public class JProgressBarError{ public static void main(String args[]) { JProgressBar bar = new JProgressBar(0, 10); bar.setValue(10); System.out.println(bar.getValue()); System.out.println(bar.getMaximum()); bar.setMaximum(20); bar.setValue(20); System.out.println(bar.getValue()); System.out.println(bar.getMaximum()); } } Это сработало, и значение можно было изменить, но по какой-то причине это не работает в моем коде!   -  person Cole    schedule 06.12.2016
comment
Я не знаю, как перейти на новую строку в комментариях!!!! :(   -  person Cole    schedule 06.12.2016
comment
Опять же, нам не нужен полный код. Опять же, я прошу вас рассмотреть возможность создания новой небольшой компилируемой и исполняемой программы. Пожалуйста, прочтите ссылку. Также избегайте размещения кода в ссылках, потому что, как вы обнаружите, его нельзя отформатировать. Также побочная рекомендация, не связанная с вашей проблемой, заключается в том, что у вас, похоже, есть код крушения поезда с большими цепочками методов. Это может привести к созданию рискованного хрупкого кода, и вы можете захотеть провести его рефакторинг. Подробнее об этом см. эту ссылку.   -  person Hovercraft Full Of Eels    schedule 06.12.2016
comment
@HovercraftFullOfEels Вау, упрощение кода и написание того, что я делал раньше, показали мне, что я должен установитьMaximum, прежде чем установитьValue, если новое значение выше текущего Maximum. Задача решена. Спасибо! Слишком долго пытался это понять.....   -  person Cole    schedule 06.12.2016
comment
Хорошая сделка — подумайте о том, чтобы опубликовать это как ответ на ваш вопрос.   -  person Hovercraft Full Of Eels    schedule 06.12.2016
comment
@HovercraftFullOfEels Спасибо за код крушения поезда. Я полностью понимаю это, и на самом деле здорово знать. Этот проект является групповым, поэтому большая часть этого кода написана другими, мне просто нужно получить к нему доступ! Создание метода на реальном игровом поле помогло бы уменьшить этот код крушения поезда, и это то, что я изменю!   -  person Cole    schedule 06.12.2016


Ответы (2)


Оказывается, если ваше новое значение выше максимального значения баров, оно не установит новое значение. Сначала необходимо обновить максимальное значение, а затем установить новое значение, равное или меньшее максимального значения. Вместо этого я поставил setMaximum перед setValue и все заработало!

person Cole    schedule 05.12.2016

import java.awt.FlowLayout;
import javax.swing.JProgressBar;

public class JProgressBarError {
    public static void main(String args[]) {
        JProgressBar bar = new JProgressBar(0, 10);
        bar.setValue(4);
        System.out.println(bar.getValue());
        System.out.println(bar.getMaximum());
        bar.setMaximum(20);
        bar.setValue(17);
        System.out.println(bar.getValue());
        System.out.println(bar.getMaximum());
    }
}

Скопировал ваш пример в комментарий и все работает. Если вы начнете с этого минимального примера, вы должны заметить, что проблем нет. Может быть, причина в цвете ваших компонентов? Опять же, я предлагаю вам начать с атомарного примера.

person Naialeoque    schedule 05.12.2016
comment
Спасибо, я написал ответ на свою проблему выше! - person Cole; 06.12.2016