【发布时间】:2017-04-20 11:48:43
【问题描述】:
我使用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());
请帮帮我!找不到进度条值不想更新的原因!!!
谢谢!
【问题讨论】:
-
如果您将minimal reproducible example 代码与您的问题一起发布,您可能会很幸运地得到一个体面的答案——一个小型的可编译可运行示例程序,为我们演示您的问题。这不是您的整个程序,而且也不大,但很小,小到足以在您的问题中完整地发布为代码格式的文本。它再次运行——有一个 main 方法,有导入和编译所需的一切。
-
实际代码很大!我试过这个:
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()); } }这有效并且值能够改变,但由于某种原因它在我的代码中不起作用! -
我不知道如何在 cmets 中换行!!!! :(
-
再次声明,我们不想看到实际的完整代码。同样,我要求您考虑创建一个新的small 可编译和可运行程序。请阅读链接。还要避免在链接中发布代码,因为您发现它无法格式化。也是一个“侧面”建议,与您的问题无关的是,您似乎有一些带有大型方法链的“火车残骸”代码。这可能会产生危险的脆弱代码,您可能希望对其进行一些重构。请参阅this link 了解更多信息。
-
@HovercraftFullOfEels 哇,简化代码并编写我之前所做的事情告诉我,如果新值高于当前最大值,我必须在 setValue 之前设置最大值。问题解决了。谢谢!一直试图解决这个问题太久了.....
标签: java swing jframe jprogressbar