Кнопка «Анимировать» при выполнении соответствующего действия с помощью горячей клавиши - PullRequest
3 голосов
/ 12 февраля 2012

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

Я делаю следующее:

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

Ответы [ 2 ]

3 голосов
/ 12 февраля 2012

Это мне подходит (не элегантно, но работает)

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

Из документов API Java для ButtonModel :

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

1 голос
/ 12 февраля 2012

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

...