Java JProgressBar在使用setValue(newValue)时不更新值

Java JProgressBar在使用setValue(newValue)时不更新值,java,swing,jframe,jprogressbar,Java,Swing,Jframe,Jprogressbar,我使用JProgressBar作为健康栏,因此我想随着游戏的进行手动设置最大值和值。该游戏是一款口袋妖怪游戏,它允许召唤新的口袋妖怪。这些新的口袋妖怪可以有不同的最大健康值和当前健康值,这就是为什么我调用progressBar.setmax(newpokemonaxhealth)和progressBar.setValue(currentPokemonHealth)。我甚至调用了progressBar.repaint(),progressBar.revalidate(),和progressBar.

我使用
JProgressBar
作为健康栏,因此我想随着游戏的进行手动设置最大值和值。该游戏是一款口袋妖怪游戏,它允许召唤新的口袋妖怪。这些新的口袋妖怪可以有不同的最大健康值和当前健康值,这就是为什么我调用
progressBar.setmax(newpokemonaxhealth)
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());
我打印出了不同口袋妖怪的当前生命值和最大生命值,这些值是它们应该的值,这表明这些值不是问题所在

出于某种原因,条形图的值似乎不想更改,但最大值会更改

当新的Pokemon health高于以前的Pokemon health时,它不会更新值。如果新的Pokemon health低于以前的Pokemon health,它会更新值,没有问题。以下是我打印的内容:

口袋妖怪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());
请帮帮我!我不知道为什么进度条的值不想更新

谢谢大家!

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());
    }
}
我在评论中复制了你的例子,一切正常。 如果您从这个最小的示例开始,应该注意到没有问题。 也许是你的组件的颜色造成的?
再次,我建议您从一个原子示例开始。

结果表明,如果您的新值高于条形图的最大值,它将不会设置新值。您必须首先更新最大值,然后设置等于或低于最大值的新值。相反,我将setMaximum放在setValue之前,所有操作都会正常进行!

您可能会遇到这样的问题如果你在问题中发布代码,你会很幸运地得到一个不错的答案——一个小的可编译的可运行示例程序,向我们演示了你的问题。这不是你的整个程序,同样也不是很大,但很小,小到足以在问题中以代码格式的文本发布。它再次运行——有一个主方法,包含导入和编译所需的所有内容。实际代码非常大!我尝试了以下方法:
import java.awt.FlowLayout;import javax.swing.JProgressBar;公共类JProgressBarError{public static void main(String args[]){JProgressBar=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());}}
这起作用了,值可以更改,但由于某种原因,它在我的代码中不起作用!我不知道如何在注释中找到新行!!!!:(再一次,我们不想看到实际的完整代码。再次,我要求您考虑创建一个新的小型可编译和可运行程序。请阅读链接。也避免在链接中发布代码,因为您发现,它不能格式化。还有一个与您的问题无关的“边”建议,您似乎有一些“火车残骸”。带有大型方法链的代码。这可能会导致危险的脆弱代码,您可能希望对其进行一些重构。有关此方面的详细信息,请参阅。@HovercraftFullOfEels哇,简化了代码并编写了我以前所做的工作,这向我表明,如果新值高于当前最大值,则必须先设置最大值,然后再设置最大值。问题已解决。谢谢!我一直在试图解决这个问题……谢谢你,我在上面发布了我问题的答案!