Thread.sleep()来摆动定时器转换

时间:2014-07-09 16:35:27

标签: java multithreading swing timer sleep

我正在尝试实现Thread.sleep(6000)行,但似乎冻结在applet中。当我尝试使用Timers时,我不确定如何使用,因为我对事件监听器不是很好。在用户单击enter按钮后,我基本上每隔6秒尝试调用一个方法fetchUrl()。我该如何实现呢?

public void init() {

    c = getContentPane();
    c.setLayout(flow);
    c.setBackground(forum); 

    question.setForeground(Color.white);
    question.setFont(tnr);  
    question2.setForeground(Color.white);
    question2.setFont(tnr);
    result.setForeground(Color.white);
    result.setFont(tnr);    
    resp.setBorder(BorderFactory.createBevelBorder(0));
    timeLength.setBorder(BorderFactory.createBevelBorder(0));
    c.add(question);    
    c.add(resp);
    c.add(question2);
    c.add(timeLength);
    c.add(enter);
    c.add(result);
    resp.requestFocus();
    enter.addActionListener(this);
    t = new Timer(DELAY, this);
    t.setInitialDelay(DELAY);

}

public void actionPerformed(ActionEvent e) {
    final String n1;
    int timeMin, timeSec, count = 0, maxCount;
    timeMin = Integer.parseInt(timeLength.getText());
    timeSec = timeMin * 60;
    maxCount = (int)(timeSec/6);
    if (e.getSource() == enter) {         //user clicks enter
        n1 = resp.getText();
        while (count < maxCount) {
            fetchUrl(n1);                 //this method called every 6 seconds
            t.start();
            count++;
        }

    }
}

2 个答案:

答案 0 :(得分:3)

首先,我首先将ActionListenerTimerJButton分开。

第二,没有任何事情与计时器逻辑上发生,因为你通过按钮源检查吞下它。

第三,您应该了解计时器的工作原理。基本上对于每个&#34; tick&#34; (在你的情况下为6秒),调用定时器ActionListener的actionPerformed。因此,如果您希望调用fetch()方法,那么您应该在Timer的执行中看到/可访问的内容。

按钮的ActionListener应该只处理我相信的计时器的启动。所以只需将听众分开。给每个人一个匿名的ActionListener,而不需要让类实现ActionListener

例如

timer = new Timer(DELAY, new ActionListener(){
    public void actionPerformed(ActionEvent e) {
        // do some stuff every six seconds
        fetchURL();
    }
});

enter = new JButton(...);
enter.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e) {
        timer.start();
    }
});

如果您想为计时器提供一些自动停止功能,您可以执行类似

的操作
timer = new Timer(DELAY, new ActionListener(){
    public void actionPerformed(ActionEvent e) {
        if (someStoppingCondition()) {
            timer.stop();
        } else {
            // do some stuff every six seconds
            fetchURL();
        }
        // do some stuff every six second
    }
});

答案 1 :(得分:0)

您需要在用户每6秒点击一次按钮后调用一个方法,但是您还没有说过要调用它的次数。

无限次,请尝试以下内容,

while(true){

     new Thread(){
          @Override
          public void run(){
                try{
                       Thread.sleep(6000);
                       fetchUrl(n1);
                }catch(InterruptedException e){}
          }

     }.start();

}

如果您在applet中使用Thread.sleep(),那么您的applet将被挂起6秒钟,因此为它创建一个新线程。