Справка Javax Swing Timer - PullRequest
       6

Справка Javax Swing Timer

3 голосов
/ 12 апреля 2010

У меня проблемы с запуском javax.swing.Timer после щелчка мышью. Я хочу запустить таймер для выполнения некоторой анимации после того, как пользователь нажимает кнопку, но он не работает.

Вот фрагменты кода:

public class ShowMe extends JPanel{
  private javax.swing.Timer timer;

  public ShowMe(){
    timer = new javax.swing.Timer(20, new MoveListener());
  }    

  // getters and setters here

  private class MoveListener implements ActionListener {

    public void actionPerformed(ActionEvent e) {
     // some code here to perform the animation
    }
  }
}

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

public class Test{

 // button declarations go here and registering listeners also here

 public void actionPerformed(ActionEvent e) {
  if(e.getSource() == this.btnConnect){
      ShowMe vis = new ShowMe();
      vis.getTimer().start();
  }
 }
}

Я хочу запустить таймер для запуска анимации, но он не работает.

Нужна помощь, как запустить таймер после нажатия кнопки.

Спасибо.

Ответы [ 4 ]

1 голос
/ 08 сентября 2010

Ваше использование класса Timer кажется правильным. Возможно, проблема кроется в MoveListener.

Вы не забыли использовать метод paintImmediately() для перекраски вашей анимации?

Если вы используете только repaint(), вы не увидите плавную анимацию, поскольку повторные вызовы на repaint() уменьшаются до одного вызова.

1 голос
/ 27 апреля 2010

Некоторые вещи попробовать:

  1. Убедитесь, что ваша панель видна, например, сделать цвет фона красным.

  2. Убедитесь, что анимация обновляется. Например, если вы анимируете, рисуя различные кадры в методе paint (), вам нужно будет вызвать repaint () в вашем таймере после обновления переменных, управляющих анимацией. В качестве альтернативы, если анимация выполняется путем изменения свойств макета (например, для перемещения компонента), тогда потребуется вызов validate ().

Использование таймера свинга может помочь вам начать, но это действительно голая основа. Существуют также библиотеки avaialbe, которые позволят вам идти дальше с меньшими усилиями:

  1. анимированные переходы
  2. Библиотека анимации Trident
1 голос
/ 12 июля 2010

Я знаю, что этот вопрос немного стар, но я не думаю, что вы получили ответ.

Я полагаю, что проблема в том, что класс ShowMe и его Timer собирают мусор и, следовательно, не могут делать то, что, как вы думаете, должны.

Вы создаете новую локальную переменную ShowMe, которая выходит из области видимости, как только завершается метод actionPerformed. Timer и его ActionListener являются локальными для экземпляра класса ShowMe, поэтому, когда метод actionPerformed завершается, они также становятся доступны для GC.

Я не уверен, что делает класс ShowMe. Похоже, что это JPanel, поэтому я предполагаю, что это то, что вы хотите отобразить. Похоже, что в вашем классе Test (или в реальном классе) может быть лучше иметь элемент данных ShowMe, который вы можете просто вызвать start один при нажатии кнопки, а не каждый раз создавать новый.

1 голос
/ 12 апреля 2010

Вы должны вызвать метод таймера start(), чтобы запустить его.

  public ShowMe(){
    timer = new javax.swing.Timer(20, new MoveListener());
    timer.start();
  }  

EDIT
Я не видел, чтобы start() вызывался в классе Test ...
Следующим шагом будет добавление регистрации / печати в класс MouseListener, чтобы проверить, вызывается он или нет

  private class MoveListener implements ActionListener {

    public void actionPerformed(ActionEvent e) {
      System.out.println("MouseListener activated");  // TODO delete this line
     // some code here to perform the animation
    }
  }

Если он запущен (я не могу найти причину, почему нет в опубликованном коде), проблема в том, что Ash написал выше: Вы создали новый экземпляр, назначенный vis, и запустили его таймер, но вы не добавили этот экземпляр ни в один видимый контейнер.
(возможно, вы добавили еще один экземпляр ShowMe ранее в коде ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...