JFrame能监听键盘事件吗?

JFrame能监听键盘事件吗?

楼主dudee() 2006-04-04 12:51:54 在 Java / J2SE / 基础类 提问

我的JFrame监听不到.请大家帮帮忙.   
  谢谢.问题点数:50、回复次数:20Top

1 楼interpb(曾曾胡,深怕情多累美人!)回复于 2006-04-04 13:11:50 得分 0

看看你的程序   
    
 Top

2 楼jobs002(Oh! Office)回复于 2006-04-04 13:15:37 得分 0

addKeyListener   
  public   void   addKeyListener(KeyListener   l)添加指定的按键侦听器,接收此组件发出的按键事件。如果   l   为   null,则不会抛出异常并且不执行操作。Top

3 楼OnlyFor_love(『勾勾手指头 一辈子不分手』)回复于 2006-04-04 13:16:43 得分 0

同意楼上   
 Top

4 楼jobs002(Oh! Office)回复于 2006-04-04 14:00:46 得分 0

import   java.awt.*;   
  import   java.awt.event.*;   
  class   Test2   extends   Frame     
  {   
  public   Test2()   
  {   
  this.addKeyListener(new   MyKeyAdapter());   
    
  }   
  private   class   MyKeyAdapter   extends   KeyAdapter   
  {   
  public   void   keyTyped(KeyEvent   e)   
  {   
  System.out.println("Pressed");   
    
  }   
  }   
  public   static   void   main(String   []args)   
  {   
  Test2   t=new   Test2();   
  t.setSize(500,500);   
  t.show();   
  }   
    
  }这个是Frame类,JFrame是Frame的子类,当然也可以接收键盘事件.Top

5 楼jobs002(Oh! Office)回复于 2006-04-04 14:05:25 得分 0

解决就揭帖..............Top

6 楼dudee()回复于 2006-04-04 14:10:25 得分 0

我的JFrme一得到焦点马上会失去焦点.是不是内部窗口把焦点夺走了,所有监听不到键盘事件.   
  那有什么办法给JFrame添加上键盘事件呢?Top

7 楼jobs002(Oh! Office)回复于 2006-04-04 14:12:40 得分 0

帖下代码,让楼上的高手给看看................Top

8 楼dudee()回复于 2006-04-04 14:27:15 得分 0

谢谢楼上的代码.帮我顶上去.   
  可能开始没把问题说清楚.我在JFrame里加入JDesktopPane用来加载内部窗口,我发现JFrame一得到焦点马上就会失去.不清楚是不是这个原因,所以才监听不到键盘事件.Top

9 楼gougou8180()回复于 2006-04-04 14:29:27 得分 0

看不懂你这代码是干嘛的Top

10 楼prowns(李大智)回复于 2006-04-04 14:33:32 得分 0

JFrame默认是不能得到焦点的,你在程序里加上setFocusable(true)应该就可以了Top

11 楼dudee()回复于 2006-04-04 15:36:26 得分 0

setFocusable(true)已经设了.还是不行.   
  是否能用一个守护线程来监听呢.还是有更好的方法.Top

12 楼jlu3389(激情的89)回复于 2006-04-04 16:45:41 得分 0

markTop

13 楼jobs002(Oh! Office)回复于 2006-04-04 17:08:19 得分 0

import   java.awt.*;   
  import   java.awt.event.*;   
  import   javax.swing.*;   
    
    class   keytest   extends   JFrame{   
    
  public   keytest(){   
  mypanel   f=new   mypanel();   
  getContentPane().add(f);       
  setSize(300,300);   
  show();   
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
    
  }   
    
    
  public   static   void   main(String   a[]){   
  new   keytest();   
  }   
  }   
    class   mypanel   extends   JPanel{   
  mypanel(){   
  setFocusable(true);//加了一句;   
  addKeyListener(new   KeyAdapter(){   
  public   void   keyTyped(KeyEvent   e){   
  char   c=e.getKeyChar();   
  if(c=='o')   System.out.print("o   is   pressed");   
  }   
  });   
  }   
  }   
  给你一个例子...........,......................Top

14 楼dudee()回复于 2006-04-04 17:32:02 得分 0

谢谢楼上的所有朋友.   
  我把问题说一次;   
  我在JFrame里加入JDesktopPane用来加载JInternalFrame,我已经设了setFocusable(true),所以JFrame才会一得到焦点马上就会失去.因为一打开一个JInternalFrame,JFrame的焦点就会被刚打开的JInternalFrame夺走,所以JFrame就无法监听到键盘事件.   
  作用是做一个全局的键盘事件监听,不管你正打开哪个JInternalFrame或JDialog.   
  想不到一个好的方法...   
    
 Top

15 楼f_acme(沧海一声笑)回复于 2006-04-04 17:40:09 得分 0

因为一打开一个JInternalFrame,JFrame的焦点就会被刚打开的JInternalFrame夺走,   
  --难道不可以对你要获取事件的那个JFrame再setFocusable(true)吗?Top

16 楼dudee()回复于 2006-04-04 17:59:42 得分 0

"难道不可以对你要获取事件的那个JFrame再setFocusable(true)吗?"   
  你的意思是说让JFrame每次触发键盘之前先setFocusable(true).但是你当前正前操作一个JInternalFrame,焦点已经在当前的JInternalFrame上.除非你的JInternalFrame也有键盘事件监听,通过当前的JInternalFrame键盘事件来触发JFrame的键盘事件.这样是肯定走得通的,如果存在有500个JInternalFrame,必需每个都得添加监听程序,太麻烦了.Top

17 楼netspies(从头再来)回复于 2006-04-05 11:39:32 得分 0

大家看看这个,看是不是真的,如果觉得是真的,就传:   
  http://life.fzylw.com/info/info.php?id=1186Top

18 楼jobs002(Oh! Office)回复于 2006-04-05 11:45:49 得分 0

请问楼上的,到底什么意思???有什么意义???????Top

19 楼qingyuan18(zealot_tang)回复于 2006-04-05 12:53:26 得分 0

焦点有三种方式:一种为当前组件获得焦点,一种是该组件的容器获得焦点,一种是该组件的子组件获得焦点,你用KeyListener是默认第一种方式获得焦点的。   
    
  建议不用底层的keyListener监听,改用给组件注册keyStroke的方式,这样可以支持所有的键盘事件,且可以设定上诉3种获取焦点方式Top

20 楼qingyuan18(zealot_tang)回复于 2006-04-05 13:00:21 得分 0

  
    
  public   class   KeyCodeAdapter   {   
    
  private   KeyCodeMap   keyCodeMap   ;   
  private   JTable   myTable;   
    
  //按键操作,包括单键和多键操作   
  private   int   iStrokeCount   =   0;   
  private   String[]   keyStrokePath   =   new   String[1024];   
  KeyStroke   keyStroke[]   =   new   KeyStroke[1024];   
    
    
    
    
  public   KeyCodeAdapter(KeyCodeMap   pm_keyCodeMap,JTable   pm_jTable)   
  {   
  this.keyCodeMap   =   pm_keyCodeMap;   
  this.myTable   =   pm_jTable;   
    
  }   
    
  /**   
    *   register   Action   to   the   JTable   
    */   
  public   void   registerAction()   
  {   
  LinkedList   keyCodeList   =   (LinkedList)keyCodeMap.getKeyCodeMapList();   
  for(int   i=0;i<keyCodeList.size();i++)   
  {   
  LinkedList   rowKeyCodeList   =   (LinkedList)keyCodeList.get(i);   
  {   
          int   iType   =   Integer.parseInt(String.valueOf(rowKeyCodeList.get(1)));   
            
          LinkedList   keyList   =   (LinkedList)rowKeyCodeList.get(2);   
          int   iModifi=0,iKeyCode=0;   
          for(int   j=0;j<keyList.size()-1;j++)   
          {   
          iModifi   =   iModifi+Integer.parseInt(String.valueOf(keyList.get(j)));   
          }   
          iKeyCode   =   Integer.parseInt(String.valueOf(keyList.get(keyList.size()-1)));   
          //add   new   KeyStroke   
            //单键操作   
          if(iModifi   ==   0)   
          {   
          keyStroke[iStrokeCount]   =   KeyStroke.getKeyStroke((char)iKeyCode);   
          }   
            //多键操作   
          else   
          {   
          keyStroke[iStrokeCount]   =   KeyStroke.getKeyStroke(iKeyCode,iModifi,false);   
            
          }   
          
          this.myTable.registerKeyboardAction(this,"iStroke"+(iStrokeCount),keyStroke[iStrokeCount],JComponent.WHEN_FOCUSED);   
          keyStrokePath[iStrokeCount]=String.valueOf(rowKeyCodeList.get(0));   
          iStrokeCount++;   
            
                    
  }   
  }   
    
    
  }   
    
    
    
  /**   
    *   cancel   the   ActionListener   
    */   
  public   void   removeAction()   
  {   
  this.myTable.resetKeyboardActions();   
  this.iStrokeCount   =   0;   
  this.keyStrokePath   =   new   String[1024];   
  this.keyStroke   =   new   KeyStroke[1024];   
    
  }   
    
  这是给JTable注册KeyStroke的例子,供楼主参考吧   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值