2011-02-25 79 views
1

我希望我的顶级JFrame以及JDesktopPane能够随时监听关键事件,无论当前哪个组件是关注/可见的。JFrame/JDesktop没有获得重点关注

目前,当这个程序启动时,JFrame正在收到关键事件确定。但是,如果单击JinternalFrame,则事件不再会到达JFrame。即使我点击了JInternalFrame(应该是JDesktop组件)之外的地方,事件也不会像开始时那样到达JFrame。为什么?谢谢。

import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.JComponent; 
import javax.swing.JDesktopPane; 
import javax.swing.JFrame; 
import javax.swing.JInternalFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 

public class focus extends JFrame implements KeyListener { 

    private focus() { 
     JDesktopPane desktop = new JDesktopPane(); 
     setContentPane(desktop); 

     addPane(this, "one"); 
     addPane(this, "two"); 
     addPane(this, "three"); 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setVisible(true); 
     setSize(400, 450); 

     addKeyListener(this); 
    } 

    public static void main(String[] args) { 
     focus t = new focus(); 
    } 

    private void addPane(JFrame frame, String name) { 
     JTextArea textArea = new JTextArea(); 
     textArea.setName(name); 
     textArea.setEditable(false); 

     addWindow(frame, textArea, name); 
    } 

    private JInternalFrame addWindow(JFrame frame, JComponent component, 
      String name) { 
     JScrollPane scrollablePane = new JScrollPane(component); 

     JInternalFrame iframe = new JInternalFrame(name + " ", true, true, 
       true, true); 

     iframe.setSize(300, 300); 
     iframe.setLocation((int) (100 * Math.random()), 
       (int) (100 * Math.random())); 
     iframe.setVisible(true); 
     iframe.getContentPane().add(scrollablePane); 
     frame.getContentPane().add(iframe); 

     return iframe; 
    } 

    @Override 
    public void keyTyped(KeyEvent e) { 
     // TODO Auto-generated method stub  
    } 

    @Override 
    public void keyPressed(KeyEvent e) { 
     System.err.println(e.getKeyChar()); 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
     // TODO Auto-generated method stub 
    } 
} 

回答

0

既然你想你的JFrame能够听取所有的关键事件无论重点是什么元素,添加的按键侦听器,其上有可重点关注的所有元素。像这样,

textArea.setEditable(false); 
**textArea.addKeyListener(this);** 

iframe.getContentPane().add(scrollablePane); 
**iframe.addKeyListener(this);** 
frame.getContentPane().add(iframe); 
1

事件被分派到具有焦点的组件。

为什么当焦点位于内部框架上时,帧会接收事件?你的实际需求是什么?

如果你想调用一个动作,那么最简单的方法是使用菜单栏和菜单项,然后你可以为每个菜单项分配加速器,这个动作可以被调用,无论组件有焦点。

0

你可能会对课程java.awt.KeyboardFocusManager感兴趣。我相信除了别的以外,这个类将把KeyEvent派发给聚焦的组件。看来,方法addKeyEventDispatcher和addKeyEventPostProcessor可以分别用于在发送到焦点组件前后获取KeyEvent。

我以前从未使用过这个类,所以我不知道它是否能达到我期望的效果。