2010-04-12 2 views
3

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

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

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(); 
    } 
} 
} 

Я хочу, чтобы запустить таймер, чтобы начать анимацию, но она не работает.

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

Спасибо.

+1

что это не работает. что происходит, и вы получаете какие-либо ошибки? –

+0

Спасибо за форматирование! –

+2

Где вы добавляете панель 'ShowMe' в свой графический интерфейс? В вашем примере кода вы просто создаете экземпляр и запускаете таймер. Или это исключенный «анимационный» код, добавляющий/извлекающий вещи, которые необходимо отобразить? – Ash

ответ

1

Чтобы запустить его, вы должны вызвать метод таймера 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 ранее в коде ...)

+0

В соответствии с образцом кода 'start()' получает вызов в прослушивателе действий, который создает панель ShowMe. – Ash

+0

@ Аш - спасибо, не видели его там ... Я думаю, что этого не должно быть в любом случае ... но изменил мой ответ. –

1

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

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

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

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

  1. animated transitions
  2. Trident animation library
1

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

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

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

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

1

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

Помните, вы использовали метод paintImmediately(), чтобы перекрасить вашу анимацию?

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

Смежные вопросы