Как остановить объект в TimerTask?

У меня есть 6 объектов в графическом интерфейсе класса, которые перемещаются по коду:

Anim anim = new Anim();
Timer timer = new Timer();
timer.scheduleAtFixedRate(anim, 30, 30);

Когда объект подходит к точке, я хочу его остановить. В классе Аним я делаю:

public class Anim extends TimerTask {
    @Override
    public void run() {
       if (t1.x == 300 && t1.y == 300) {
         try {
            Thread.sleep(3000);
         } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
         }

Он останавливает приложение, а я хочу задержаться на конкретном объекте. Как это сделать?

ИЗМЕНИТЬ:

Ок, теперь работает хорошо, другим объектам не мешает. Но объект движется дальше и через 1 секунду возвращается в исходное положение. Я хочу, чтобы он все время был в одном и том же положении, когда спал.

if (Main.auto1.x == 700 && Main.auto1.y == 350) {
        timer = new javax.swing.Timer(1000, new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                Main.auto1.x = 700;
                Main.auto1.y = 350;
            }
        });
        timer.setRepeats(false);
        timer.start();

person user3756381    schedule 19.06.2014    source источник
comment
Вы используете приложение Swing?   -  person Braj    schedule 19.06.2014
comment
@Braj Да, я использую Swing.   -  person user3756381    schedule 19.06.2014


Ответы (1)


Используйте Swing Timer вместо Thread.sleep() и < href="http://docs.oracle.com/javase/7/docs/api/java/util/Timer.html" rel="nofollow noreferrer">таймер Java в приложении Swing, которое иногда зависает Приложение Swing.

Подробнее Как использовать таймеры Swing

Образец кода:

private Timer timer;
...
timer = new javax.swing.Timer(3000, new ActionListener() {
    
    @Override
    public void actionPerformed(ActionEvent arg0) {

       //do what ever you want to do
       // call timer.stop() when the condition is matched
         
    }
});
timer.setRepeats(true);
timer.start();

РЕДАКТИРОВАТЬ

Пожалуйста, взгляните на мой другой пост Как исправить задержки анимации в Java?

person Braj    schedule 19.06.2014
comment
Я изменил класс Anim на: public class Anim extends TimerTask { public void run() { if (t1.x == 300 && t1.y == 300) {{ timer = new javax.swing.Timer(3000, new ActionListener () { @Override public void actionPerformed(ActionEvent arg0) { timer.stop(); } }); ... ... timer.setRepeats(true); таймер.старт(); Но не выполнил никакой паузы. Где мне теперь поставить паузу, например 5 секунд? - person user3756381; 19.06.2014
comment
Было бы здорово, если бы вы могли поделиться воспроизводимым кодом. - person Braj; 19.06.2014
comment
Ок, теперь работает хорошо, другим объектам не мешает. Но объект движется дальше и через 1 секунду возвращается в исходное положение. Я хочу, чтобы он все время был в одном и том же положении, когда спал. if (Main.auto1.x == 700 && Main.auto1.y == 350) { timer = new javax.swing.Timer(1000, new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { Main.auto1 .x = 700;Main.auto1.y = 350;} }); timer.setRepeats (ложь); таймер.старт(); - person user3756381; 19.06.2014
comment
Вместо комментария, почему бы не добавить его в свой исходный пост как РЕДАКТИРОВАТЬ, как это сделал я. Это читается в комментарии? - person Braj; 19.06.2014
comment
Как починить машину, чтобы машина завелась с того места, где вы остановились, и уехала из этого места, где он был без таймера? - person user3756381; 20.06.2014
comment
вы сохранили координату где-то в коде. Просто используйте его и не сбрасывайте его. - person Braj; 20.06.2014