【问题标题】:How do you temporarily pause a loop until a button is pressed in java你如何暂时暂停循环,直到在java中按下按钮
【发布时间】:2013-05-09 23:11:08
【问题描述】:

在等待按下按钮时,如何让循环暂时暂停?我找了好久,好像没找到,想来这里试试。

编辑-

我正在创建一个二十一点游戏,我添加了一个带有按钮、HITME 和 STAND 的 gui,一旦游戏到达循环中我需要让玩家输入到 HITME 或 STAND 的点我添加了按钮来执行那个,但我不知道如何暂停循环以检查按钮是否被按下,以及继续哪个按钮。

我试过的是这样的:

 (othercode)  
g.printPlayerCards(p1);
            g.totalworth(p1);
            thing.messagetop("Your total card amount is: " + p1.getTotalWorth());
            thing.messagetop("Hit me? or stay?");
            thing.waitonbutton();


public void waitonbutton(){
        wantingtobeclick = 1;
        do{
            while(!(hitme == 0)){
                hitme = 0;
                wantingtobeclick =0;
            }
        }while(wantingtobeclick == 1);
    }

public void actionPerformed(ActionEvent e) {
        if(wantingtobeclick == 1){
            if (e.getSource() == HitMe){
                hitme = 1;
                System.out.println("ICLICKEDHITME");
                g.hitMe(player1);
                waitonbutton();
            }
            if(e.getSource() == Stand){
                hitme = 1;
                g.changestandhit();
            }
        }
    }

它只是停留在一个无限循环中,不会继续在 main 中循环。

【问题讨论】:

  • 你试过什么?你能展示一些代码吗?你为什么要这么做?
  • “循环”一般只用于实时游戏。如果使用 UI 工具包,请编写对事件做出反应的代码(对于 MVM,规则是不同的,但是..)。也就是说,做A,等待按钮,做B。(但标题*非常令人困惑,因为它是关于按下in Java的按钮?这个Java和Python如何交互/相关?)
  • 反应事件。不要让游戏由提示输入的循环驱动,而是让游戏响应输入。如果您确实想保持循环驱动的方法,请查看“模态对话框”。
  • 为了详细说明 user224 对循环的评论,您的 GUI 框架已经有一个用于调度事件的循环(这就是它执行 actionPerformed 的方式)。所以你通常不会有自己的循环,而只是让一切都是事件驱动的。
  • 如果您真的需要使用循环,您可能需要阅读线程管理 API,因为您将拥有一个线程,您的按钮处理程序正在运行,即 GUI 线程,然后在另一个线程上循环。

标签: loops button


【解决方案1】:

我已经修好了,以防万一其他人有同样的问题:

我将此添加到主目录:

        do{

        } while(!(thing.waitonbutton()));

然后这是我的图形类:

> public boolean waitonbutton(){
        wantingtobeclick = 1;
        if(hitme == 1){
            wantingtobeclick = 0;
            hitme = 0;
            return true;
        }
        return false;
    }

   public void actionPerformed(ActionEvent e) {
        if(wantingtobeclick == 1){
            if (e.getSource() == HitMe){
                hitme = 1;
                g.hitMe(player1);
            }
            if(e.getSource() == Stand){
                hitme = 1;
                g.changestandhit();
            }
        }
    }

【讨论】:

  • 没有事件驱动的代码会很快耗尽用户的电量。一个无限的while循环让cpu一直在运行。
【解决方案2】:

我认为“暂停”循环的唯一方法是在循环期间执行更多代码,最好在不同的线程上执行。即

while (true) {
    if (_buttonIsPressed) {
        Thread.sleep(5000); // loop is paused
    }
}

但是,更重要的是,感觉你可能会以错误的方式处理事情。

与其运行一个循环来检查是否发生了什么事情,不如在按下按钮后触发一个动作。这称为event-driven programming

【讨论】:

    【解决方案3】:

    只需一个按钮和几个状态变量,您就可以在没有 while 循环的情况下完成它:
    我在这里做了一点小技巧:http://jsbin.com/uyetat/2/edit

    代码是:

    var elapsed=document.getElementById('timeElapsed');
    var switcher = document.getElementById('switcher');
    
    var timerStarted    = false;
    var refreshInterval = null ;
    var timeStarted     = 0    ;
    
    function switchTimer() {
             if (timerStarted) {
                  timerStarted = false;
                  clearInterval(refreshInterval);
                  switcher.value = "start";
             } else {
                  timeStarted = Date.now();
                  refreshInterval = setInterval (refresh, 100);
                  timerStarted=true;
                  switcher.value = "stop";
             }    
     }
    
     function refresh() {
           elapsed.value = (Date.now() - timeStarted);
     }
    

    html 正文是:

     <output id='timeElapsed' >not started
     </output>
    
     <button  onclick='switchTimer()' >
        <output id='switcher' >Start </output>
     </button>
    

    Rq :如果您愿意,可以使用 mousedown / mouseup 事件并测量保持时间。

    【讨论】:

      【解决方案4】:

      我最近一直在寻找同一个问题的答案,但由于我没有找到任何令人满意的答案,所以我能够像下面这样处理它。希望这将有助于将来遇到同样问题的任何人。请注意,我是初学者,所以可能有更好的方法来处理它。也就是说 - 它完全符合预期 - 停止循环,直到按下按钮。在下面的示例中,我使用了 for 循环,但它与 while 一样有效。

      诀窍是参考 GUI,它在单独的线程中运行,然后在后端运行,并与该线程同步循环。为了示例的目的,下面当然被简化了。代码显示带有 1 个按钮的框架,每次点击都会增加计数器。

      public static void main(String[] args) {
      
          var button = new JButton("loop");
          button.setPreferredSize(new Dimension(400, 200));
      
          //create frame thread
          Runnable frameThread = new Runnable() {
              @Override
              public void run() {
                  var frame = new JFrame("Wait Example");
                  frame.add(button);
                  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                  frame.pack();
                  frame.setVisible(true);
              }
          };
      
          //create action listener for button
          button.addActionListener(new ActionListener() {
              @Override
              public void actionPerformed(ActionEvent e) {
                  synchronized (frameThread) {
                      frameThread.notifyAll();
                  }
              }
          });
      
          //run frame thread
          EventQueue.invokeLater(frameThread);
      
          //loop synchronized with frame thread
          for (int i = 1; i < 10; i++) {
              synchronized (frameThread){
                  button.setText(Integer.toString(i));
                  try {
                      frameThread.wait();
                  } catch (InterruptedException e1) {
                      e1.printStackTrace();
                  }
              }
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2012-11-27
        • 2017-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多