通过热键执行相应操作时的动画按钮

时间:2012-02-12 17:28:20

标签: java swing animation action key-bindings

我有动作加上按钮和热键。我希望动画(动画类似于鼠标点击时显示的动画)按钮通过热键触发其各自的动作。这可能吗?

我的做法如下:

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

2 个答案:

答案 0 :(得分: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 - 这意味着在鼠标先前按下该按钮(并且尚未释放)之后将其释放到按钮顶部。鼠标释放后,模型将变为非武装和未按下状态。

答案 1 :(得分:1)

请参阅AbstractButton.setPressedIcon(Icon)(以及接受Icon的相关方法)。我们的想法是将非动画图标设置为标准图标,将动画GIF设置为备用图标。