0

在等待按下按钮时,如何使循环暂时暂停?我已经四处寻找了一段时间,我似乎找不到它,以为我会在这里尝试。

编辑-

我正在创建一个二十一点游戏,我添加了一个带有按钮、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 中的循环。

4

4 回答 4

0

我修复了它,以防万一其他人有同样的问题:

我将此添加到主要内容:

        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();
            }
        }
    }
于 2013-05-11T15:22:14.280 回答
0

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

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

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

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

事件示例

于 2013-05-09T23:33:02.940 回答
0

只需一个按钮和一些状态变量,您就可以在没有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 事件并测量保持时间。

于 2013-05-11T16:01:33.350 回答
0

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

}
于 2019-11-20T11:20:25.807 回答