2012-05-18 128 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      
       } 

      } 
     }); 
相关问题