我的JFrame监听不到.请大家帮帮忙.
谢谢.

解决方案 »

  1.   

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

  2.   

    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的子类,当然也可以接收键盘事件.
      

  3.   

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

  4.   

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

  5.   

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

  6.   

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

  7.   

    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");
    }
    });
    }
    }
    给你一个例子...........,......................
      

  8.   

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

  9.   

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

  10.   

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

  11.   

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

  12.   

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

  13.   

    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的例子,供楼主参考吧