2016-11-24 139 views
-1

我正在做一个游戏,我需要每3秒更新一次JProgressBar。为此,我使用了一个while循环。问题是我的程序冻结了while循环的原因(我在其他问题中读过它,它们并没有帮助我解决这个问题)。我不知道如何解决它。这里是我的代码:Java:虽然循环冻结程序

public static void city (String[] args){ 
     //loading some of the saveData (not all of it is made yet) 
    try{ 
     File saveDataFile = new File("save.dat"); 
     Scanner saveDataSc = new Scanner(saveDataFile); 

     int power = saveDataSc.nextInt(); 
     int people = saveDataSc.nextInt(); 
     int food = saveDataSc.nextInt(); 
     int wood = saveDataSc.nextInt(); 
     int iron = saveDataSc.nextInt(); 
     int stone = saveDataSc.nextInt(); 

     saveDataSc.close(); 

    } catch (FileNotFoundException ex){} 

    frame.remove(introImage4); 
    frame.remove(startingScreen); 
    frame.add(background1); 

     //background properties 
    background1.setLayout(null); 

     //sideBar properties 
    sideBar.setLayout(null); 
    sideBar.setBounds(700,0,200,600); 

     //button properties 
    AltarListB.setBounds(50,20,100,100); 
    InventortyB.setBounds(25,515,150,20); 
    ArmyB.setBounds(25,545,150,20); 
    MessagesB.setBounds(25,485,150,20); 
    MissionsB.setBounds(25,455,150,20); 
    MapB.setBounds(117,170,65,30); 
    FieldB.setBounds(18,170,65,30); 
    TownB.setBounds(68,135,65,30); 

     //image properties 
    underline1.setBounds(0,205,200,31); 
    underline2.setBounds(0,426,200,24); 

     //prograssbar properties 
    powerProg.setMinimum(0); 
    peopleProg.setMinimum(0); 
    woodProg.setMinimum(0); 
    foodProg.setMinimum(0); 
    ironProg.setMinimum(0); 
    stoneProg.setMinimum(0); 

    powerProg.setMaximum(500); 
    peopleProg.setMaximum(500); 
    woodProg.setMaximum(500); 
    foodProg.setMaximum(500); 
    ironProg.setMaximum(500); 
    stoneProg.setMaximum(500); 


    powerProg.setStringPainted(true); 
    peopleProg.setStringPainted(true); 
    woodProg.setStringPainted(true); 
    foodProg.setStringPainted(true); 
    ironProg.setStringPainted(true); 
    stoneProg.setStringPainted(true); 

    powerProg.setValue(power); 
    peopleProg.setValue(people); 
    woodProg.setValue(wood); 
    foodProg.setValue(food); 
    ironProg.setValue(iron); 
    stoneProg.setValue(stone); 

    powerProg.setString("Power: " + power + "/" + "maxPower"); 
    peopleProg.setString("People: " + people + "/" + "maxPeople"); 
    woodProg.setString("Wood: " + wood + "/" + "maxWood"); 
    foodProg.setString("Food: " + food + "/" + "maxFood"); 
    ironProg.setString("Iron: " + iron + "/" + "maxIron"); 
    stoneProg.setString("Stone: " + stone + "/" + "maxStone"); 

    powerProg.setBounds(14,241,170,20); 
    peopleProg.setBounds(14,273,170,20); 
    woodProg.setBounds(14,305,170,20); 
    foodProg.setBounds(14,337,170,20); 
    ironProg.setBounds(14,369,170,20); 
    stoneProg.setBounds(14,401,170,20); 

     //adding stuff 
    sideBar.add(AltarListB); 
    sideBar.add(InventortyB); 
    sideBar.add(ArmyB); 
    sideBar.add(MessagesB); 
    sideBar.add(MissionsB); 
    sideBar.add(MapB); 
    sideBar.add(FieldB); 
    sideBar.add(TownB); 
    sideBar.add(underline1); 
    sideBar.add(underline2); 
    sideBar.add(powerProg); 
    sideBar.add(peopleProg); 
    sideBar.add(woodProg); 
    sideBar.add(foodProg); 
    sideBar.add(ironProg); 
    sideBar.add(stoneProg); 

    background1.add(sideBar); 


    background1.revalidate(); 
    background1.repaint(); 
    frame.revalidate(); 
    frame.repaint(); 
    resourceLoader(new String[] {"a","b","c"}); 
} 

public static void resourceLoader (String[] args){ 
    while(true){ 
     try{ 
      File saveDataProgFile = new File("save.dat"); 
      Scanner saveDataProgSc = new Scanner(saveDataProgFile); 

      power = saveDataProgSc.nextInt(); 
      people = saveDataProgSc.nextInt(); 
      food = saveDataProgSc.nextInt(); 
      wood = saveDataProgSc.nextInt(); 
      iron = saveDataProgSc.nextInt(); 
      stone = saveDataProgSc.nextInt(); 

      saveDataProgSc.close(); 

      powerProg.setValue(power); 
      peopleProg.setValue(people); 
      woodProg.setValue(wood); 
      foodProg.setValue(food); 
      ironProg.setValue(iron); 
      stoneProg.setValue(stone); 

      background1.revalidate(); 
      background1.repaint(); 
      frame.revalidate(); 
      frame.repaint(); 

      saveDataProgSc.reset(); 

      try{ 
       Thread.sleep(3000); 
      } catch(InterruptedException e){ 
       Thread.currentThread().interrupt(); 
      } 
     } catch (FileNotFoundException ex){} 
    } 
} 

你能帮我一下吗?

+0

虽然循环执行该程序应该怎么做其他同时吗? –

+0

你需要在这里删除所有不相关的代码。 – Carcigenicate

+1

看起来你可能会在主应用程序线程中“休眠”。 – Carcigenicate

回答

1

你应该运行在自己的线程循环:

 new Thread(new Runnable() { 
      @Override 
      public void run() 
      { 
       resourceLoader (null); 
      }}).start(); 

BTW:如果不使用“字串[] args”的方法,没有理由把它在方法中声明。

1

您将需要使用线程。但要小心,并且不要尝试从不拥有进度栏的线程更新GUI组件(JProgressBar)。

你应该使用SwingUtilities.invokeLater来做到这一点。