Я пытаюсь реализовать Thread.sleep(6000)
но она, похоже, замерзает в апплете. Когда я пытался использовать Таймеры, я не был уверен, как использовать, потому что я не очень хорошо разбираюсь в прослушивателях событий. Я в основном пытаюсь вызвать метод fetchUrl()
каждые 6 секунд после того, как пользователь нажимает кнопку ввода. Как я могу это реализовать?
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++;
}
}
}
Сначала я начну с разделения ActionListener
на Timer
и JButton
.
Второй логически ничего не происходит с таймером, потому что вы проглатываете его с помощью проверки источника кнопки.
В-третьих, вы должны понимать, как работает таймер. В основном для каждого "тика" (в вашем случае шесть секунд) actionPerformed
действие, actionPerformed
из таймера ActionListener. Поэтому, если вы хотите fetch()
метод fetch()
, то это то, что вы должны быть видимыми/доступными для действия в Timer actionPerformed.
Кнопка 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
}
});
Вам нужно вызвать метод после того, как пользователь нажимает кнопку на каждые 6 секунд, но вы не сказали, сколько раз вы хотите его назвать.
Для бесконечного количества раз попробуйте следующее:
while(true){
new Thread(){
@Override
public void run(){
try{
Thread.sleep(6000);
fetchUrl(n1);
}catch(InterruptedException e){}
}
}.start();
}
Если вы будете использовать Thread.sleep() в своем апплете, ваш апплет будет повешен на 6 секунд и, таким образом, создаст для него новый поток.