当前位置: 首页 > 知识库问答 >
问题:

java程序卡在while循环中

鲁望
2023-03-14

我正在编写一个基于文本的冒险游戏,我遇到了一个问题。我正在将它从终端移植到JFrame GUI,我需要它在继续之前等待用户输入。我设置了一个系统,其中有一个名为按钮的布尔变量,它开始时为false。当按下提交文本按钮时,它会将其更改为true。有一个while循环,它会等待按钮变为true,然后才允许程序继续,基本上是暂停程序直到用户提交输入。问题是,只有当我在while循环中写入system.out.println行时,它才有效。否则,在我单击按钮后它不会继续。有什么问题?

public class event implements ActionListener{
    public void actionPerformed(ActionEvent e){
        moves += 1;
        movesLabel.setText("Moves: " + moves);

        buttonPressed = true;

        try{
            input = (String)(textfield.getText());
            textfield.setText("");

        }catch(Exception ex){
            textfield.setText("Error");
        }
    }
}


public static void main (String args[]) {
    Main gui = new Main();
    gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    gui.setVisible(true);
    gui.setSize(650, 350);
    gui.setTitle("Sprinkles Text Adventure");

    setInventory();

    textArea.setText(textDisplay("Welcome Adventurer!"));
    textArea.setText(textDisplay("What is thy name: "));

    while(!buttonPressed){
      // this only works when I have system.out.println("something") written in
    }

    buttonPressed = false;

    textArea.setText(textDisplay(input));

    if ("alice".equals(input)||"Alice".equals(input)){
        textArea.setText(textDisplay("Stop toking the magical pipe, "));
        textArea.setText(textDisplay("you aren't alice and this isn't wonderland"));
        textArea.setText(textDisplay("Now down the rabbit hole you go!"));
    }
    else if ("l3ikezI".equals(input)||"l3ikezi".equals(input)){
        System.out.println("Magic and Technology flows through your veins");
        System.out.println("Welcome back, Master");
        for(int j = 0; j<14; j++){
            Chest[j]=1;
        }
    }
    else{
        System.out.println("Enter " + input + " and good luck!\n\n");
    }

共有2个答案

程禄
2023-03-14

while(!buttonPressed){
  // this only works when I have system.out.println("something") written in
}

只是自找麻烦,除了不能保证实际调用了哪个线程main,这可能会导致阻塞事件调度线程之外,这是错误的方法。

不要使用JFrame,而是要使用某种模式的JDialog,它会在对话框可见时阻止代码的执行,直到它被释放/关闭,并以安全的方式执行,以便您可以在EDT的上下文中使用它。

查看初始线程、Swing中的并发以及如何制作对话框以了解更多详细信息。

作为一般建议,避免直接从顶级容器(如JFrameJDialog)进行扩展,并选择使用JPanel之类的工具,这样可以释放您的空间,提高组件的可重用性

巫马阳飙
2023-03-14

我不是java专家,但是
看起来您没有给gui线程时间做任何事情,因为您正忙着等待布尔值的更改。要解决这个问题,你可能需要使用一个信号量。或者,更简单(肮脏)的解决方案是在while循环中调用sleep()。对于java特定的东西,请看这个问题。

仔细想想,我发现java有一个volatile关键字。我不知道按钮pressed是否声明为volatile,但如果不是,编译器可能会决定,因为while循环是空的,它的值永远不会改变,并将其替换为while(true),作为优化。

 类似资料:
  • 主要内容:while 语句,do-while 语句,while和do-while的比较循环是程序中的重要流程结构之一。循环语句能够使程序代码重复执行,适用于需要重复一段代码直到满足特定条件为止的情况。 所有流行的编程语言中都有循环语句。 Java 中采用的循环语句与C语言中的循环语句相似,主要有 while、do-while 和 for。另外 Java 5 之后推出了 for-each 循环语句,for-each 循环是 for 循环的变形,它是专门为集合遍历而设计的。for-ea

  • 问题内容: 我正在制作一个以这种方式执行的while循环程序: 主线程进入while循环。 在while循环中什么也没有发生。 线程将停留在while循环中,直到满足条件为止。 另一个线程运行一个满足上述条件的函数。 这是一个例子: 类中还有另一个函数会将路径设置为null,一旦发生这种情况,主线程应退出此循环。在另一个线程中调用另一个函数。 但是,即使将path设置为null,主线程也不会退出循

  • 我想写一个程序,把每4位数字的每一位相加。例如,我从1000开始,加上1001,千变成2,百变成0,十变成0,单位变成1。这将持续增加每个数字,直到达到9999。这是我的代码,它只输出9999。

  • 我需要对while或do循环进行编码,以确定用户输入的数字是否在特定范围内(30

  • 问题内容: 在我正在开发的应用程序上,我已经花了好一阵子了。经过数小时的尝试,调试了一个问题,该问题是接口锁定,什么也没发生,我发现这是可怕的While循环。请参阅下面的示例并运行它。通过单击按钮启动while循环时,您将无法在屏幕上执行任何其他操作。在这种情况下,只需按下一个简单的警报按钮即可。 如何有一个循环需要运行直到计数完成并且仍然能够在我的应用程序中执行其他任务?我还应该注意,我已经使用

  • 出现的问题是,当用户确实输入了一个正数时,它仍然忽略输入,并要求用户再次输入一个正整数。我想我只是没有正确退出循环,但我不确定是如何退出的。