Необходимо применить таймер Swing, но безуспешно

Извините, если я кажусь глупым. Я только начинаю. У меня еще почти не было занятий. Я хотел применить временную задержку к моему циклу for. Я пробовал с thread.sleep, но это делает весь графический интерфейс неработоспособным. Мне сказали использовать таймер Swing для указанного кода, поэтому я попытался. Я видел несколько руководств, и я не могу заставить их работать. Это часть моего кода:

for (int d = 0; d < 201; d++) {
                    //Need to insert time delay here
                    System.out.println(jorgegress);
                    progressbard.setValue(jorgegress);
                }

И это одна из моих попыток заставить его работать:

JButton buttond = new JButton("Click me");
        buttond.setBounds(10, 190, 416, 63);
        
        Timer timer;
        timer = new Timer(1000, null);
        timer.setRepeats(true);
        
        buttond.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                System.out.println("ok this works");
                for (int d = 0; d < 201; d++) {
                    //Need to insert time delay here
                    timer.start();
                    System.out.println(d);
                    progressbard.setValue(d);
                }
                timer.stop();

Что я делаю не так? (наверное много не так делаю)


person user14618910    schedule 12.11.2020    source источник
comment
вы запускаете таймер 200 раз... почему? ... возможно, вы можете опубликовать свой полный код и то, что вы пытаетесь сделать именно... прочитайте это stackoverflow.com/help /минимально-воспроизводимый-пример   -  person JavaMan    schedule 12.11.2020
comment
Смысл использования таймера состоит в том, чтобы заменить логику цикла в вашем приложении. Таймер становится циклом, потому что он генерирует событие каждую секунду (в вашем примере). Затем ваш слушатель реагирует на событие. См.: stackoverflow .com/questions/30417719/ для самого простого примера. Кроме того, не используйте нулевой макет и setBounds(...). Swing был разработан для использования с менеджерами компоновки.   -  person camickr    schedule 12.11.2020


Ответы (1)


Попробуйте это вместо вашего цикла for. Нажатие кнопки запустит таймер. Таймер остановится сам по себе, когда достигнет нужного значения. Это очень просто. Его можно дополнительно настроить, чтобы учитывать пороги подсчета, задержки и даже другие методы для запуска (через лямбда-выражения).

Timer t = new Timer(0, new ActionListener() {
  int count = 0;
  public void actionPerformed(ActionEvent ae) {
     if (count > 201) {
         ((Timer)ae.getSource()).stop();
     }    
     System.out.println(jorgegress);
     progressboard.setValue(jorgegress);
     count++;
   }     
});
    
t.setDelay(100); // delay is in millseconds.
t.start();

Вы можете заблокировать кнопку во время работы таймера, а затем снова включить ее, когда таймер остановится. Это предотвратит одновременную работу нескольких таймеров.

person WJS    schedule 12.11.2020