请查看以下代码
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,当按住CTRL + A(控制键和“A”键)时,我需要显示消息“OK”。但上面的代码是错误的。因此,当两个键被按在一起时,请帮助我获取消息。
答案 0 :(得分: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.将动作绑定到击键:
check.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK), "doSomething");
check.getActionMap().put("doSomething", new MyAction());
警告:我没有测试过此代码,因此可能需要修复一些小问题。
答案 1 :(得分:1)
您应该使用事件k
中的方法:
if(k.isControlDown() && k.getKeyCode() == KeyEvent.VK_A) {
但请记住,这仅适用于您的按钮聚焦时。例如,当您向JTextField
添加frame
并在其中写入内容时,Ctrl+A
将无效,因为JTextField
已成为焦点。
答案 2 :(得分:0)
public void keyPressed(KeyEvent k)
{
if(k.getKeyCode() == KeyEvent.VK_A && (k.getModifiers & KeyEvent.CTRL_MASK) != 0)
{
JOptionPane.showMessageDialog(null, "OK");
}
}
}
答案 3 :(得分: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
}
}
});