Thread.sleep () для преобразования таймера Swing

1

Я пытаюсь реализовать 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++;
        }

    }
}
Теги:
multithreading
timer
swing
sleep

2 ответа

3

Сначала я начну с разделения 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
    }
});
  • 0
    Спасибо, я понимаю, что вы подразумеваете под кнопкой, поглощающей источник. Это сработало
0

Вам нужно вызвать метод после того, как пользователь нажимает кнопку на каждые 6 секунд, но вы не сказали, сколько раз вы хотите его назвать.

Для бесконечного количества раз попробуйте следующее:

while(true){

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

     }.start();

}

Если вы будете использовать Thread.sleep() в своем апплете, ваш апплет будет повешен на 6 секунд и, таким образом, создаст для него новый поток.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню