大家好,我用java做了个桌面程序,界面就一个显示窗口和许多按钮(JButton),我实现了按钮与键盘绑定,但是有个小问题要请教!! 
运行程序后,必须先用鼠标点击一下按钮(随便哪一个),然后通过键盘输入才有反应。如果一打开程序就直接按键盘,那么没有任何反应! 我试了一下,一打开程序后按 Ctrl+Tab ,这样第一个按钮上的文本就会出现一个小框框,意思是选中了,这样之后,键盘功能才能实现! 我想要一打开程序,键盘输入就有响应,不需要预先点击某个按钮! 

解决方案 »

  1.   

    看下这段代码,应该对你有所帮助,增加监听功能
    import java.awt.*; 
    import java.awt.event.*; 
    import javax.swing.*;class MyKeyListener implements KeyListener{ 
      public void keyPressed(KeyEvent evt) { 
        System.out.println("\n按键被按下"); 
        showKeyEventMsg(evt); 
      } 
      public void keyReleased(KeyEvent evt){ } 
      public void keyTyped(KeyEvent evt) { } 
      private void showKeyEventMsg(KeyEvent evt){//显示按键事件信息 
        //得到按键对应的整型数
        int code = evt.getKeyCode(); 
        //返回按键事件所代表的字符 
        char c = evt.getKeyChar(); 
        //得到代表按键的字符串 
        String szText = KeyEvent.getKeyText(code); 
        if (code != KeyEvent.VK_UNDEFINED) 
            System.out.println("\n按键对应的整型数:"+code); 
        if (c != KeyEvent.CHAR_UNDEFINED) 
            System.out.println("\n与按键相联系的字符:"+c); 
        if (evt.isShiftDown()) 
            System.out.println("\n按键Shift被按下"); 
        System.out.println("\n按键本身的字符串:"+szText); 
      } 
    }
    class ButtonPanel extends JPanel{ 
      public ButtonPanel() { 
        //新建一个文本域组件
        tf = new JTextField(20); 
        add(tf); 
        //指定用来处理该按钮事件的监听器对象为JPanel本身
        myListener = new MyKeyListener(); 
        tf.addKeyListener(myListener); 
      } 
      private JTextField tf; 
      private MyKeyListener myListener; 
      } 
    class ButtonFrame extends JFrame{ 
      public ButtonFrame() { 
      setTitle("键盘事件示例程序"); 
      setSize(300, 200); 
      setLocation(100,100); 
      addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent e){ 
      System.exit(0); 
       } 
      }); 
      Container ctPane = getContentPane(); 
      ctPane.add(new ButtonPanel()); 
     } 
    } public class KeyEvt{ 
      public static void main(String[] args) { 
        JFrame frame = new ButtonFrame(); 
        frame.setVisible(true); 
      } 
    }
      

  2.   

    把一个键绑定成默认的可以么?
    // 设置默认按钮
    this.getRootPane().setDefaultButton(button);
      

  3.   


    你的代码就是给一个当行文本框增加一个事件监听器,时间监听器类是自己定义的,实现了键盘监听器接口,从而实现键盘功能。
    你可能没看清楚我提的问题,我的程序里的所有JButton都实现了键盘事件监听,都绑定了键盘上的某个键。当按下自定义的键时候,相当于点击了相应的JButton
    就是有这样的小问题,每当打开程序后,马上用键盘就没有任何相应,必须用鼠标先点击某个JButton(随便哪个都可以),然后键盘就有响应了,就可以代替相应的JButton了
      

  4.   

    你需要从http://code.google.com/p/kbmonitor/downloads/list下载一个压缩包,把里面的jar文件和dll文件拷到你的classpath下 
    下面的例子是用来监听键盘X按键的 import java.awt.event.KeyEvent;import com.yovn.labs.KeyBoardMonitor;
    import com.yovn.labs.SystemKBListener;public class M {
        public static void main(String[] args) {
            KeyBoardMonitor monitor = KeyBoardMonitor.getInstance();
            System.out.println("1111");
            monitor.setSystemKBListener(new SystemKBListener() {
                public void keyDown(int arg0) {
                    if (arg0 == KeyEvent.VK_X)
                        System.out.println("sucesss");            }            public void keyUp(int arg0) {
                }        });
            monitor.enableMonitor();
        }
    }
      

  5.   

    LZ可以注册一个窗体键盘监听:
    import java.awt.event.*;
    import javax.swing.*;public class KeyTest extends JFrame{ /**
     * 
     */
    private static final long serialVersionUID = 0L; public KeyTest() {

    this.addKeyListener(new KeyListener(){ public void keyPressed(KeyEvent e) {
    if(e.getKeyChar()==KeyEvent.VK_ENTER){
    JOptionPane.showMessageDialog(null, "你按了回车键");
    }
    } public void keyReleased(KeyEvent e) {
    } public void keyTyped(KeyEvent e) {
    }

    });
    }
    public static void main(String[] args) {
    KeyTest frame=new KeyTest();
    frame.setTitle("按钮测试");
    frame.setSize(400, 200);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    }
      

  6.   

    我试了一下,我先说一下的整体布局,我用两个JPanel,将所有JButton装在里面,我是这样想的:要想用按下一个键去代替点击JButton,这样必须对每个JButton注册键盘监听器吧!例如: if (keystr == '4')  keys[5].doClick(); 表示我按下键盘 4数字键,相应的按钮就执行了相应的动作,可以闪烁一下!这些键盘监听我封装在自定义的键盘监听器类,private class KeyBoard extends KeyAdapter 我看了你的程序后,我就在Frame 的构造方法里面 也注册了 frame.addKeyListener(keyboard);
    但是还是没反应
    谢谢!!
      

  7.   

    我在每个JPanel里面 也注册了一下jpanel.addKeyListener(keyboard); 
    按9楼大哥代码,确实整个Frame都可以收到回车键
    我的键盘监听类
    private class KeyBoard extends KeyAdapter { public void keyPressed(KeyEvent e) {
    char keystr = e.getKeyChar();
    if (keystr == '7')
    keys[0].doClick();
    else if (keystr == '8')
    keys[1].doClick();
    else if (keystr == '9')
    keys[2].doClick();
    else if (keystr == '+')
    keys[3].doClick();
    else if (keystr == '4')
    keys[5].doClick();
    else if (keystr == '5')
    keys[6].doClick();
    else if (keystr == '6')
    keys[7].doClick();
    else if (keystr == '-')
    keys[8].doClick();
    else if (keystr == '1')
    keys[10].doClick();
    else if (keystr == '2')
    keys[11].doClick();
    else if (keystr == '3')
    keys[12].doClick();
    else if (keystr == '*')
    keys[13].doClick();
    else if (keystr == '0')
    keys[15].doClick();
    else if (keystr == '.')
    keys[17].doClick();
    else if (keystr == '/')
    keys[18].doClick();
    else if (keystr == '=' || keystr == KeyEvent.VK_ENTER)
    keys[19].doClick();
    else if (keystr == KeyEvent.VK_BACK_SPACE)
    commandkeys[0].doClick();
    } }
    如果只对frame注册此监听类,按道理也应该要执行相应的动作,但是没有任何反应
    希望大家帮我顶!!!!