2011-02-25 2 views
1

현재 포커스가있는 구성 요소에 상관없이 내 최상위 JFrame은 물론 JDesktopPane이 키 이벤트를 항상 듣고 싶습니다.JFrame/JDesktop이 키 포커스를 수신하지 않습니다.

현재이 프로그램을 실행하면 JFrame이 키 이벤트를 수신하고 있습니다. 확인을 누릅니다. 그러나 JinternalFrame을 클릭하면 이벤트가 더 이상 JFrame에 도달하지 않습니다. JInternalFrame 외부 (JDesktop 구성 요소라고 가정 됨)를 클릭하더라도 처음부터했던 것처럼 이벤트는 더 이상 JFrame에 도달하지 않습니다. 왜? 고마워. 당신이 당신의 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

초점이 될 수있는 모든 요소에 키 리스너로서 그를 추가합니다.

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

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

, 그래서 같이 이벤트는 포커스가있는 구성 요소에 전달됩니다.

왜 포커스가 내부 프레임에있을 때 프레임이 이벤트를 수신하게 하시겠습니까? 실제 요구 사항은 무엇입니까?

조치를 호출하려면 가장 쉬운 방법은 메뉴 항목과 함께 메뉴 막대를 사용한 다음 각 메뉴 항목에 액셀러레이터를 지정하여 구성 요소에 포커스가있을 때 호출 할 수있는 방법입니다.

0

java.awt.KeyboardFocusManager 클래스에 관심이있을 수 있습니다. 저는 다른 것들 중에서 KeyEvents를 포커스 된 컴포넌트로 파견하는 것이 클래스라고 믿습니다. addKeyEventDispatcher 및 addKeyEventPostProcessor 메소드는, 포커스 된 컴퍼넌트에 전후에 KeyEvents를 취득하기 위해서 사용할 수있는 것처럼 보입니다.

나는이 수업을 전에 사용하지 않았기 때문에 내가 기대하는 바를하지 못한다.

관련 문제