2015-10-07 3 views
0

В этой программе, мы должны нажать на кнопку с надписью «Пуск», а затем анимация начнется через экран. После того, как мы нажмем «Начать», кнопка затем изменится на кнопку «Пауза», где, если вы нажмете ее, она остановит анимацию и появится кнопка «Возобновить». Я не уверен, как получить все три этих действия в одну кнопку. Вот код, который у меня есть до сих пор:Множественные действия в JButton

JButton button = new JButton("Start"); 
     button.addActionListener(new 
     ActionListener() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 
       Timer t = new Timer(100, new 
        ActionListener() 
        { 
         public void actionPerformed(ActionEvent event) 
         { 
          shape.translate(x, y); 
          label.repaint(); 
         } 
        }); 
       t.start(); 
      } 
     }); 

Я знаю, что это неправильно. Когда я запускаю программу, анимация простаивает до тех пор, пока я не нажму «Start», что правильно, но каждый раз, когда я снова нажимаю кнопку, анимация ускоряется, что неверно. Как я могу добавить различные действия к кнопке?

Например, после того, как анимация запущена, я хочу, чтобы кнопка «Пауза» остановила Таймер при нажатии, а затем возобновит таймер, когда я нажму «Возобновить». Теперь код, который я создал, создает новый объект Timer каждый раз, когда я нажимаю на него, но это, похоже, единственный способ заставить его работать. Если я выложу что-либо за пределы ActionListener, я получаю ошибку области. Какие-либо предложения?

ответ

1

Я знаю, что это неправильно. Когда я запускаю программу, анимация простаивает до тех пор, пока я не нажму «Start», что правильно, но каждый раз, когда я снова нажимаю кнопку, анимация ускоряется, что неверно.

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

//... 
private Timer timer; 
//... 

JButton button = new JButton("Start"); 
button.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     if (timer == null) { 
      timer = new Timer(100, new ActionListener() { 
       public void actionPerformed(ActionEvent event) { 
        shape.translate(x, y); 
        label.repaint(); 
       } 
      }); 
      timer.start(); 
      button.setText("Pause"); 
     } else if (timer.isRunning()) { 
      timer.stop(); 
      button.setText("Resume"); 
     } else { 
      timer.start(); 
      button.setText("Pause"); 
     } 
    } 
}); 
+0

Большое вам спасибо! Это фиксировало это. Я знал, что у меня было так, что каждый раз создавал новый таймер, чего я не хотел. Я никогда не думал поставить таймер в свои частные переменные экземпляра. – GenericUser01

1

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

Не следует создавать Timer в ActionListener. Каждый раз, когда вы нажимаете кнопку, вы начинаете новый таймер.

Вместо создания Timer в конструкторе класса. Затем в ActionListener вы просто start() существующих Timer.

Затем Pause и 'Resume buttons will also just invoke the stop() and restart() `методы и на существующий таймер.

+0

Это является проблемой. Я попытался это сделать, но я получаю сообщение «Не могу ссылаться на нелокальную переменную t, определенную в охватывающей области». Единственный способ заставить это работать - поставить конструктор для Timer в «ActionListener». – GenericUser01

+0

@ GenericUser01 Там не совсем достаточно контекста, чтобы вам пример кода, чтобы быть в состоянии обеспечить полное решение этой проблемы, за исключением того, чтобы сказать, попытайтесь задать Timer' поле экземпляра 'класса – MadProgrammer

+1

способ сделать это состоит в реструктуризацию чтобы таймер определялся как переменная экземпляра в вашем классе. – camickr