由于本人应用的是NetBean,建立键盘事件的时候电脑会自动生成以下代码,只可读取不可修改。
        jPanel1.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                jPanel1KeyPressed(evt);
            }
        });
以下是可以修改的部分。
    private void jPanel1KeyPressed(java.awt.event.KeyEvent evt) {                                   
    } 
请问高手,指点以下问题:
1.addKeyListener(..)用于jPanel和jFrame有什么区别?
2.以上代码是否只需要处理jPanel1KeyPressed(..)即可?为什么我在运行时没发现有什么反映呢?即使在jPanel1KeyPressed(..)中添加System.out.println("Something");也没有任何输出。
3.在网络上学习相关资料时听说Keydown/Keyup事件,是不是指的就是这个keyPressed/keyrelease?听说DirectInPut更好用,可以同时捕捉多个键盘事件,请问那个应该如何使用呢?谢谢指点!!!

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【thankyouforyourhelp】截止到2008-07-02 20:07:06的历史汇总数据(不包括此帖):
    发帖的总数量:5                        发帖的总分数:156                      
    结贴的总数量:4                        结贴的总分数:90                       
    无满意结贴数:1                        无满意结贴分:50                       
    未结的帖子数:1                        未结的总分数:66                       
    结贴的百分比:80.00 %               结分的百分比:57.69 %                  
    无满意结贴率:25.00 %               无满意结分率:55.56 %                  
    楼主加油
      

  2.   

    1.监听者不一样
    2.JPanel好像不响应键盘事件,以前遇到这个问题,没解决了
    3.不知道...没听说过
      

  3.   

    谢谢LS的回答。目前经过不断调试,我发现我的程序只响应button上的键盘事件!谁能告诉我一下是什么问题呢?还有什么是焦点,什么是监听者呢?还有需要如何使用线程呢?我是在button上添加了一个start(),是否是因为这样所以才会只响应button上的键盘事件?谁能解释一下原因呢?谢谢了。
      

  4.   

    首先JAVA不支持同时按2个键然后,监听者是凌驾在全局的一个东西,只要有事件触发,他都执行onXXXX方法,然后里面对于事件本身进行具体操作,具体就是看焦点在哪,也就是被谁触发了。多线程是说你做这件事的时候,可以独立异步的完成一系列工作。你可以在本身做start也可以new一个多线程的类再start,具体看你的实际需要
      

  5.   

    谁能稍微具体回答下1L和3L的问题?谢谢.现在比较想了解DirectInPut的使用,如果能指点的话~分数将全部送出~谢谢了!!!
      

  6.   


    关于第二条不认同,因为我最常做的事情就是在JPanel上监听键盘事件你要JPanel监听到键盘事件,就要把焦点获得。具体方法为jp.graFoucusable();
      

  7.   

    记忆有点错误是这个grabFocuspublic void grabFocus()    请求此 Component 获得输入焦点,并且此 Component 的顶层祖先成为获得焦点的 Window。此 component 对于所要许可的请求而言必须是可显示的、可见的和可聚焦的。    此方法由焦点实现所使用。客户端代码不应使用此方法;相反,它应该使用 requestFocusInWindow()。 
      

  8.   

    1.对象不同而已
    2.如果没响应,那就是你的监听不到位(监听键盘事件一定要被监听对象获得焦点)
    3.keyPressed是键下压的意思,keyrelease是键释放的意思,对于你说的Keydown/Keyup事件,在java里面没听说过,估计是别的语言的吧(c#之类的)
      

  9.   

    你可以在本身做start也可以new一个多线程的类再start,具体看你的实际需要
      

  10.   

    解决第二个问题的import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;import javax.swing.JButton;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JPanel;public class SimpleTest {    /**
         * @param args
         */
        public static void main(String[] args) {
            JFrame frame = new JFrame();
            JButton button = new JButton("Test");
            button.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    System.out.println("actionPerformed");
                }
            });
            button.addMouseListener(new MouseAdapter() {
                public void mousePressed(MouseEvent e) {
                    System.out.println("mousePressed");
                }
            });
            final JPanel panel = new JPanel();
            panel.add(button);
            panel.setFocusable(true);
            frame.getContentPane().add(panel);
            panel.addKeyListener(new KeyListener() {            public void keyPressed(KeyEvent e) {
                    System.out.println("panel keyPressed");
                }            public void keyReleased(KeyEvent e) {
                    System.out.println("panel keyReleased");
                }            public void keyTyped(KeyEvent e) {
                    System.out.println("panel keyTyped");
                }
            });
            panel.addMouseListener(new MouseAdapter() {
                public void mousePressed(MouseEvent e) {
                    ((JComponent) e.getSource()).grabFocus();
                }
            });
            frame.setVisible(true);
            frame.setSize(200, 200);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    }
      

  11.   

    谢谢LS,谢谢大家。我也把我了解的情况和大家分享一下。1.监听者不一样。
    2.应该是缺少焦点,这样“panel.setFocusable(true); ”应该可以响应panel上的事件。
    3.Keydown/Keyup事件好象是比较早的语言,现在好象功能被取消了。最后请高手指点下DirectInPut的使用,谢谢了!
      

  12.   

    全局级的监听器:    Toolkit.getDefaultToolkit().addAWTEventListener(listener, eventMask);然后自己去写 listener 类就可以了