2012-02-12 1 views
3

У меня есть действия, связанные с кнопками, а также с горячими клавишами. Я хочу анимировать (анимацию, похожую на ту, что показана во время щелчка мыши), когда ее соответствующее действие запускается через горячие клавиши. Это возможно?Кнопка анимации, когда соответствующее действие выполнено через горячую клавишу

Я делаю следующим образом:

 btnAdd.setAction(addDataAction); 
     panelAdd.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT) 
       .put(KeyStroke.getKeyStroke("ctrl ENTER"), addDataAction); 
     panelAdd.getActionMap().put(addDataAction, addDataAction); 

ответ

3

Это делает трюк для меня (не элегантный, но он работает)

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.AbstractAction; 
import javax.swing.JButton; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.KeyStroke; 
import javax.swing.Timer; 

public class Test extends JFrame { 

    public static void main(String[] args) { 
     Test t = new Test(); 
     final JButton button = new JButton(); 
     AbstractAction action = new AbstractAction("Hello World!") { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       button.getModel().setArmed(true); 
       button.getModel().setPressed(true); 
       Timer t = new Timer(200, new ActionListener() { 

        @Override 
        public void actionPerformed(ActionEvent e) { 
         button.getModel().setArmed(false); 
         button.getModel().setPressed(false); 
        } 
       }); 
       t.setRepeats(false); 
       t.start(); 
       // Do action stuff 
      } 
     }; 
     button.setAction(action); 

     JPanel panel = new JPanel(); 
     panel.add(button); 

     panel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke("ctrl ENTER"), action); 
     panel.getActionMap().put(action, action); 

     t.add(panel); 

     t.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     t.pack(); 
     t.setVisible(true); 
    } 
} 

От Java API docs for ButtonModel:

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

+0

Вы также можете установить нажатое состояние, если вы переопределите метод 'processKeyBinding' панели и проверьте правильность нажатия клавиши для действия, тогда, по крайней мере, ваше действие не обязательно должно знать о кнопке. – ughzan

+0

Он работает! но это отличается от фактического. Если щелкнуть мышью, кнопка получит синий фон, чего здесь не происходит. В любом случае Хороший ответ! Благодарю. – Ahamed

+0

Чтобы получить «синий» фон, сделайте 'setArmed (true)' then' setPressed (true) ', а затем в событии таймера' setArmed (false) 'then' setPressed (false) '. Порядок важнее, иначе ваше действие будет вызвано снова. – ughzan

1

См AbstractButton.setPressedIcon(Icon) (и связанных с ними методов, которые принимают в Icon). Идея заключалась бы в установке неанимированного значка в качестве стандартного значка и анимированного GIF в качестве альтернативного.

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