我有动作加上按钮和热键。我希望动画(动画类似于鼠标点击时显示的动画)按钮通过热键触发其各自的动作。这可能吗?
我的做法如下:
btnAdd.setAction(addDataAction);
panelAdd.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)
.put(KeyStroke.getKeyStroke("ctrl ENTER"), addDataAction);
panelAdd.getActionMap().put(addDataAction, addDataAction);
答案 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设置为备用图标。