2016-11-24 3 views
-1

게임을 만들고 있는데 3 초마다 JProgressBar를 업데이트해야합니다. 그렇게하려면 while 루프를 사용하십시오. 문제는 내 프로그램이 while 루프를 얼려 버린다는 것입니다 (다른 질문에서 읽었을 때,이 문제를 해결하는 데 도움이되지 못했습니다). 나는 그것을 해결하는 방법을 모른다. 여기 내 코드는 다음과 같습니다.Java : while 루프가 프로그램을 고정시킵니다.

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

당신은 자신의 스레드에서 루프를 실행해야 당신이 방법을 가질 이유가없는 "문자열 []에 args"를 사용하지 않는 경우 메서드에서 선언되었습니다.

0

이 프로그램으로 무엇을하려고하는지 잘 모르겠습니다 만, 자신의 일정한 시간 간격 대신에 청취자를 사용하여 조사하고 싶을 수도 있습니다. 또한 while 조건이 사실이라면 솔루션을 구현하는 간단한 방법이 있다는 냄새 일 것입니다. 스레드를 사용하는 것이 불타고 있습니다. BTW

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

:

https://docs.oracle.com/javase/tutorial/uiswing/events/eventsandcomponents.html

1

스레드를 사용해야합니다. 그러나 조심해야하며 진행 막대를 소유하지 않은 스레드에서 GUI 구성 요소 (JProgressBar)를 업데이트하지 마십시오.

이렇게하려면 SwingUtilities.invokeLater를 사용해야합니다.

관련 문제