我正在尝试实现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++;
}
}
}
答案 0 :(得分:3)
首先,我首先将ActionListener
与Timer
和JButton
分开。
第二,没有任何事情与计时器逻辑上发生,因为你通过按钮源检查吞下它。
第三,您应该了解计时器的工作原理。基本上对于每个&#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秒钟,因此为它创建一个新线程。