无法实现键盘操作

时间:2011-09-03 16:35:50

标签: java swing keyboard action keyboard-events

我根本没有了解如何实现键盘操作。

鼠标点击,按钮,Textfield,Textarea我很好,键盘对我来说就像中国墙。

我有类似的东西,当我按下“C”时,我想实现键盘关闭:

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

public class TestGUI
{
    private KeyboardListener anEventListener;

    public TestGUI()
    {
        initGUI();
    }

    private void initGUI()
    {       
        //Prepare Frame
        JFrame myFrame = new JFrame();
        myFrame.setTitle("Test");
        myFrame.setSize(550, 500);
        myFrame.setLocation(600, 100);
        myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        myFrame.setLayout(null);

        KeyboardListener anEventListener = new KeyboardListener();

        //Show Frame
        myFrame.setVisible(true);

    }

    public static void main(String args[])
    {
        SwingUtilities.invokeLater(new Runnable() 
        {
            public void run() 
            {
                new TestGUI();
            }
        });
    }

    class KeyboardListener implements KeyListener
    {

      public void keyPressed (KeyEvent event)
      { 
        if (event.getKeyCode() == KeyEvent.VK_C)
        { 
            System.exit(0);
        }
      }          

      public void keyReleased(KeyEvent event)
      {

      }
      public void keyTyped (KeyEvent event)
      {

      }
    } 



}

4 个答案:

答案 0 :(得分:3)

我首先查看Key Bindings。这比KeyListeners更可靠,因为它没有很多焦点问题。此外,KeyListeners是针对此类问题的旧AWT解决方案。

答案 1 :(得分:3)

  

我想在按下“C”时关闭键盘关闭:

然后你应该创建一个自定义Action并使用带有关闭菜单项和加速器的JMenu。

来自Closing an ApplicationExitAction会为您执行此操作。

答案 2 :(得分:1)

您尚未将KeyboardListener附加到组件。您也没有使用班级中定义的anEventListener字段 - 它被隐藏在initGUI内。

答案 3 :(得分:1)

只需添加一行

即可
myFrame.addKeyListener(anEventListener);

在你的框架中注册你的听众,它会正常工作。

注意:这只会处理与您的框架相关的关键事件。如果你周围有其他组件,你可能希望以不同的方式处理它(另请参阅how to use key bindings)。

在您的情况下,您可以非常轻松地构建具有键绑定的版本:

JComponent rootPane = myFrame.getRootPane();
rootPane.getInputMap().put(KeyStroke.getKeyStroke("C"), "closeThisOne");
rootPane.getActionMap().put("closeThisOne", new AbstractAction() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.exit(0);
    }
});