Java:while 循环冻结程序 [英] Java: while loop freezes program

查看:25
本文介绍了Java:while 循环冻结程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在制作一个游戏,我需要每 3 秒更新一次 JProgressBar.为此,我使用了一个 while 循环.问题是我的程序由于 while 循环而冻结(我在其他问题中阅读了它,他们没有帮助我解决这个问题).我不知道如何解决.这是我的代码:

I'm making a game and i need to update the JProgressBar every 3 seconds. To do that i use a while loop. The problem is that my program freezes becuse of the while loop (i read it in other questions, they didn't help me to solve this). I don't know how to solve it. Here is my code:

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){}
    }
}

你能帮我解决这个问题吗?

Can you please help me with this?

推荐答案

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

You should run your loop in an own Thread:

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

顺便说一句:如果你没有在方法中使用String[] args",就没有理由在方法中声明它.

BTW: If you do not use the "String[] args" in the method there is no reason to have it declared in the method.

这篇关于Java:while 循环冻结程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆