当前位置: 首页 > 面试题库 >

Java:while循环冻结程序

卢俭
2023-03-14
问题内容

我正在做一个游戏,我需要每3秒更新一次JProgressBar。为此,我使用while循环。问题是我的程序由于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){}
    }
}

你能帮我吗?


问题答案:

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

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

顺便说一句:如果您没有在方法中使用“ String [] args”,则没有理由在方法中声明它。



 类似资料:
  • 问题内容: http://i.stack.imgur.com/XvHm5.png 当我单击“打开”按钮时,它将开始在JTextField上发送垃圾邮件1。而是冻结整个GUI,包括关闭按钮。我正在使用while循环,当您再次单击jButton时,它将停止。因为jButton被冻结,所以我无法停止该程序。我已经读过线程和多线程将有所帮助,但是所有教程都太复杂了,以至于我无法理解。他们说将循环和GUI放

  • 我试图创建GUI Api。首先,我只在控制台中使用打印信息构建python脚本。 所以我想将应用程序重建为具有接口的应用程序。我决定用PyQt5 我在运行时遇到了循环问题。应用程序在运行时冻结 我准备了一个简短的脚本来模拟这个问题。主程序看起来不一样 在主程序中,在检查GraphQL中批量请求的状态时使用:

  • 我有一个带有“开始”按钮和进度条的小型GUI测试。期望的行为是: 单击开始 Progressbar振荡5秒 进度条停止 观察到的行为是“开始”按钮冻结5秒钟,然后显示进度条(无振荡)。 以下是我目前的代码: 根据Bryan Oakley提供的信息,我知道我需要使用线程。我试着创建一个线程,但我猜,由于线程是从主线程中开始的,所以没有帮助。 我的想法是将逻辑部分放在一个不同的类中,并从该类中实例化G

  • 问题内容: 我有一个带有“开始”按钮和进度条的小型GUI测试。所需的行为是: 点击开始 进度条振荡5秒钟 进度栏停止 观察到的行为是“开始”按钮冻结5秒钟,然后显示进度条(无振荡)。 到目前为止,这是我的代码: 根据Bryan Oakley 在此提供的信息,我了解我需要使用线程。我尝试创建一个线程,但是我猜测由于该线程是从主线程中启动的,因此没有帮助。 我有想法放置在不同的类中的逻辑部分,以及从该

  • for while loop break 与 continue label for for 语句用于遍历一个迭代器。 for var in iterator { code } Rust 迭代器返回一系列的元素,每个元素是循环中的一次重复。然后它的值与 var 绑定,它在循环体中有效。每当循环体执行完后,我们从迭代器中取出下一个值,然后我们再重复一遍。当迭代器中不再有值时,for 循环结束。

  • 问题内容: 我正在用cardLayout更改“视图”(此类有一个变量)。当用户单击新游戏按钮时,会发生以下情况: 游戏的循环方法和类标题: 我在用画 实际上,它没有画任何东西。当我不调用方法(因此它仅绘制一次)时,所有图像均正确绘制。但是当我调用方法时,窗口中什么也没有发生。(即使关闭按钮也不起作用。) 如何解决?(当我在游戏课程中创建游戏时,一切正常,但是现在我想拥有更多视图,因此我需要在其他课