在java中按下按钮之前,如何暂时暂停循环?

时间:2013-05-09 23:11:09

标签: loops button

当我等待按下按钮时,如何暂停暂停?我一直在四处寻找,我似乎无法找到它,以为我会在这里试试。

编辑 -

我正在制作一个二十一点游戏,一旦游戏到达循环点,我需要将玩家输入到HITME或STAND我添加按钮来执行,我用按钮,HITME和STAND添加了一个gui那,但我无法弄清楚如何暂停循环检查按钮是否被按下,以及哪一个继续。

我试过的是这个:

 (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 个答案:

答案 0 :(得分:0)

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

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

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

而不是运行循环来检查是否发生了某些事情,一旦按下按钮,你最好不要触发动作。这称为event-driven programming

Example of events

答案 1 :(得分:0)

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

我把它添加到main:

        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();
            }
        }
    }

答案 2 :(得分: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事件并测量保持时间。

答案 3 :(得分:0)

最近我一直在寻找相同问题的答案,但由于找不到满意的答案,因此可以按以下方式进行处理。希望这将对将来遇到同样问题的任何人有所帮助。请注意,我是一个初学者,所以可能会有更好的方法来处理它。就是说-确实达到了预期的效果-停止了循环直到按下按钮。在下面的示例中,我使用for循环,但是它与while一样有效。

技巧是引用GUI,该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();
            }
        }
    }

}