2012-02-12 60 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設置爲備用圖標。