如何制作键盘输入系统?

时间:2017-08-27 19:35:51

标签: java swing jpanel components keylistener

[EDITED] 如何编写一个在键盘输入时响应的类,而不将此类扩展到任何类型的swing组件。

如果我写这样的课:

public class Test implements KeyListener {
   public Test(){}

   @Override
   public void keyPressed(KeyEvent e) { ... }

   @Override
   public void ketTyped(KeyEvent e) { ... }
   .
   .
   .
}

这不起作用,因为我无法从我的Test课程中获得焦点,对吧? 相反,如果我写一个类:

public class Test2 extends JPanel{
    public Test2 {
       addKeyListener(new KeyListener() {....});
       requestFocusInWindow();
    }
}

这项工作,但这不是我的目标

1 个答案:

答案 0 :(得分:0)

任何类都可以实现KeyListener接口。然后,您可以创建此类的实例,并使用addKeyListener(...)方法将侦听器添加到Swing组件。

例如:

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

public class MyKeyListener extends KeyAdapter
{
    @Override
    public void keyPressed(KeyEvent e)
    {
        Component c = (Component)e.getSource();
        System.out.println(c);                 
        System.out.println(e);
    }

    private static void createAndShowGUI()
    {
        JPanel panel = new JPanel();
        panel.setFocusable( true );
        panel.addKeyListener( new MyKeyListener() );

        JFrame frame = new JFrame("MyKeyListener");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( panel );
        frame.setSize(200, 200);
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater( () -> createAndShowGUI() );
/*
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
*/
    }
}

KeyAdapter类是一个实现KeyListener类的所有方法的类。因此,上面的代码扩展了该类,只覆盖了提供自定义代码的方法。