2012-02-12 59 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 2012-02-12 18:13:46

+0

它的工作原理!但这与实际情况不同。如果点击鼠标,按钮变为蓝色背景,这不会发生在这里。无论如何,好的答案!谢谢。 – Ahamed 2012-02-12 18:19:07

+0

要获得“蓝色”背景,先执行setArmed(true),然后调用setPressed(true),然后在定时器事件setArmed(false)中调用setPressed(false)。顺序很重要,否则你的行动将被再次调用。 – ughzan 2012-02-12 18:48:12

1

AbstractButton.setPressedIcon(Icon)(和相关方法接受一个Icon)。这个想法是将非动画图标设置为标准图标,并将动画GIF设置为备用图标。