2012-05-18 122 views
3

請看看下面的代碼Java KeyListener:如何在按下兩個鍵時執行動作?

import java.awt.event.*; 
import javax.swing.*; 
import java.awt.*; 

public class KeyCheck extends JFrame 
{ 
    private JButton check; 
    private JPanel panel; 
    private FlowLayout flow; 

    public KeyCheck() 
    { 
     check = new JButton("Check"); 
     check.addKeyListener(new KeyWork()); 

     panel = new JPanel(); 
     panel.setLayout(new FlowLayout()); 
     panel.add(check); 

     getContentPane().add(panel); 

    } 

    private class KeyWork extends KeyAdapter 
    { 
     public void keyPressed(KeyEvent k) 
     { 
      if(k.getKeyCode()==KeyEvent.VK_CONTROL && KeyEvent.VK_A) 
      { 
       JOptionPane.showMessageDialog(null, "OK"); 
      } 
     } 
    } 
    public static void main(String[]args) 
    { 
     KeyCheck k = new KeyCheck(); 
     k.setVisible(true); 
     k.setSize(200,200); 
     k.validate(); 
     k.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 

在這種情況下,我已經添加一個keylister到按鈕,我需要它來顯示消息「OK」時CTRL + A被壓在一起(控制鍵和「A」鍵)。但上面的代碼是錯誤的。所以,當兩個鍵被按在一起時,請幫助我得到消息。

回答

5

你混合key code and modifiers

if(k.getKeyCode()==KeyEvent.VK_A 
    && (k.getModifiers & KeyEvent.CTRL_MASK==KeyEvent.CTRL_MASK)) 

但更普遍的,它是更好地使用KeyBindings代替的KeyListener。它會讓你的生活變得更容易,並避免你必須進行那些測試。

1,創建一個這樣的動作:

public class MyAction extends AbstractAction { 

    public void actionPerformed(ActionEvent e) { 
      JOptionPane.showMessageDialog(null, "OK"); 
    } 
} 

2.Bind的動作擊鍵:

check.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK), "doSomething"); 
check.getActionMap().put("doSomething", new MyAction()); 

注意事項:我沒有測試此代碼,所以可能要修復小毛病。

+0

無論如何,它爲什麼不與工作的JMenuItem ? –

+0

@Sepala很難說沒有看到你的代碼。在這個問題上發佈另一個問題。您可能會通過發佈[SSCCE](http://sscce.org)獲得快速回復。 –

1

你應該在事件k使用方法:

if(k.isControlDown() && k.getKeyCode() == KeyEvent.VK_A) { 

但請記住,當你的按鈕集中,這隻會工作。例如,當您將JTextField添加到您的frame並在其中寫入內容時 - Ctrl+A將不起作用,因爲JTextField是重點。

0

     public void keyPressed(KeyEvent k) 
     { 
      if(k.getKeyCode() == KeyEvent.VK_A && (k.getModifiers & KeyEvent.CTRL_MASK) != 0) 
      { 
       JOptionPane.showMessageDialog(null, "OK"); 
      } 
     } 
    } 
0

您還可以使用鍵助記符或促進劑,它是非常簡單的: 1.助記符將會打開一個菜單 2.加速器會按下相應的菜單按鈕

JMenuItem combination = new JMenuItem("Save File"); 
combination.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, ActionEvent.CTRL_MASK)); 
     combination.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       if (e.getSource() == find) { 
       System.out.println("Ctrl+S pressed"); 
savefile();//depending on what your saving code is      
       } 

      } 
     }); 
相關問題