这是我的代码:
while(monster.curHp > 0)
{
System.out.println("");
if(battle.pressedButton)
{
text = Player.name + ": " + Player.curHitPoints + " " + monster.name + ": " + monster.curHp;
battle = new GUIForBattle(text,Player,monster);
}
}
奇怪的是,如果我在while循环中有println行,代码将正常工作,当按下按钮时,我们将更新文本以获得当前状态,我们将使用GUIForBattle类重绘GUI,但是如果我没有那个println就不会重绘。有什么建议?谢谢!
以下是更多上下文的GUIForBattle
public class GUIForBattle extends JFrame {
boolean pressedButton = false;
public GUIForBattle(String words, player PlayerOne, Monster monster)
{
JFrame frame = new JFrame(); //frame that holds everything
JPanel Panel = new JPanel(new GridLayout(5,5)); //panel where things get added
JLabel text = new JLabel(words); // text label
JButton attack = new JButton("Attack"); //makes a button used to attack
//adding what pressing the attack button would do
attack.addActionListener(
new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
int attackAmount = PlayerOne.weaponEquipped.att;
monster.curHp = monster.curHp - attackAmount;
pressedButton = true;
}
}
);
JButton Item = new JButton("Item"); // makes a button used to use items
Item.addActionListener(
new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
//we need to make a item interface
}
});
Panel.add(text); //adds the text to the panel
Panel.add(attack);
Panel.add(Item);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(800, 800); //setting size of frame
frame.add(Panel); //adding the panel to frame
frame.setVisible(true); //making the frame visible
}
}
答案 0 :(得分:1)
您的代码本质上是多线程的;一个线程正在运行那个小while
循环;另一个是将处理你的swing事件处理程序的swing应用程序线程。
如果你使用这样的共享变量(两个线程都访问pressedButton
),你需要确保变量在线程之间同步。有几种方法可以解决这个问题,但解决这个问题的一个简单方法就是使变量变为volatile。
如果变量未以任何方式同步,则JVM无法保证一个线程何时会看到'另一方对它做出的改变。通常情况下,如果你让一个线程占用就像你在这里做的那样(这个循环称为忙等待)它永远不会花时间进行同步,你永远不会看到更新。
println是一个IO操作,这意味着在某些时候你的线程将等待IO完成。这很可能导致JVM同步变量,这就是你注意到这种差异的原因。
在任何情况下,依赖于此而不考虑同步可被视为错误。
Java线程和内存处理是一个复杂的主题,而不是我建议初学者跳入的东西;它可能是压倒性的。现在尝试避免在线程之间共享内存。目前,只需在你的应用程序代码中运行你的逻辑(它不是理想的,但对于一些初学者代码,它可能是一个很好的起点)。
如果您准备好了,请阅读the memory model and what it implies for multi-threading。