2011-02-25 135 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。

我以前從未使用過這個類,所以我不知道它是否能達到我期望的效果。