2013-09-28 71 views
2

我需要一些幫助,將Keylistener或鍵綁定添加到下一個示例中的按鈕。當我按下鍵盤上的A或B時,我想要使用與按下鼠標時相同的動作。添加keylistener或鍵綁定到使用ActionListener的JButtons

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class NetTest { 

    static JButton btnA = new JButton("A"); 
    static JButton btnB = new JButton("B"); 
    static JPanel jp = new JPanel(); 
    static JFrame jf = new JFrame("Test APP"); 
    static JLabel jl = new JLabel("Which button was clicked ?"); 

    static ActionListener action = new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      jl.setText(((JButton)e.getSource()).getText()); 
     } 
    }; 

    public static void main(String[] args) { 
     jf.setVisible(true); 
     jf.setSize(400, 400); 
     jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     jp.add(btnA); 
     jp.add(btnB); 
     jp.add(jl); 
     jf.add(jp); 

     btnA.addActionListener(action); 
     btnB.addActionListener(action); 
    } 
} 

回答

3

爲了聽你需要使用JComponent#getInputMap()JComponent#getActionMap()方法把你想要聽的輸入事件和對應的動作KeyEvents。試試下面這個例子:

import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import javax.swing.AbstractAction; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class Demo{ 

    private void initGUI(){ 
     AbstractAction buttonPressed = new AbstractAction() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       System.out.println(e.getActionCommand()); 
      } 
     }; 

     JButton submit = new JButton("Submit"); 
     submit.addActionListener(buttonPressed); 

     /* 
     * Get the InputMap related to JComponent.WHEN_IN_FOCUSED_WINDOW condition 
     * to put an event when A key is pressed 
     */ 
     submit.getInputMap(javax.swing.JComponent.WHEN_IN_FOCUSED_WINDOW). 
       put(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_A,0), "A_pressed"); 
     /* 
     * Add an action when the event key is "A_pressed" 
     */ 
     submit.getActionMap().put("A_pressed", buttonPressed); 

     /* 
     * Same as above when you press B key 
     */ 
     submit.getInputMap(javax.swing.JComponent.WHEN_IN_FOCUSED_WINDOW). 
       put(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_B,0), "B_pressed"); 
     submit.getActionMap().put("B_pressed", buttonPressed); 

     JPanel content = new JPanel(new FlowLayout()); 
     content.add(new JLabel("Test:")); 
     content.add(submit); 

     JFrame frame = new JFrame("Demo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setContentPane(content); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new Demo().initGUI(); 
      } 
     }); 

    } 
} 

注:這個例子使用當按下JButton或A/B鍵同樣AbstractAction,但輸出將取決於誰是事件源。

注2:如果您使用JComponent.WHEN_IN_FOCUSED_WINDOW條件,只要按下A或B鍵,您的動作就會執行。如果您有文本輸入組件(例如JTextfieldJTextArea),並且最終用戶幾乎肯定會多次按A或B鍵,則不需要此行爲。如果是這種情況,那麼你將不得不使用JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT條件。

+0

dic19我做了我的功能,你爲我節省button.This說是我的code.But它沒有工作了我。我addedd我的代碼這裏.plz檢查,並幫助me.AbstractAction buttonPressed =新AbstractAction(){ \t \t @覆蓋 \t \t \t公共無效的actionPerformed(ActionEvent的E2){ \t \t \t \t的System.out.println(e2.getActionCommand() ); \t \t \t \t} \t \t}; \t \t \t buttonSave.addActionListener(buttonPressed); \t buttonSave.getInputMap(javax.swing.JComponent.WHEN_IN_FOCUSED_WINDOW).put(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S,0),「save」); ()「save」,buttonPressed);}}}} –

2

如果我明白你想達到什麼目的,基本上你想聽兩個特定的鍵盤事件(按下「A」或「B」鍵),並切換標籤,就好像你點擊了兩個JButton中的一個。

您只需將KeyListener添加到您的框架,並實現其回調以響應「A」或「B」類型。 還記得你的JFrame對象調用setFocusable(假)

jf.setFocusable(true); 
    jf.addKeyListener(new KeyListener() { 

     @Override 
     public void keyTyped(KeyEvent evt) { 
     } 

     @Override 
     public void keyPressed(KeyEvent evt) { 
     } 

     @Override 
     public void keyReleased(KeyEvent evt) { 
     } 
    });