2013-01-21 6 views
2

keyListener에 프레임을 등록했지만 keyListener가 작업을 실행하지 않습니다. 다른 코드에서는 KeyListener 인터페이스를 구현하고 JFrame을 등록하고 적절한 메서드를 재정의하는 것이 keyListener가 작동하는 데 필요한 모든 것입니다.KeyListener가 작업을 트리거하지 않음

import java.awt.BorderLayout; 
import java.awt.Point; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionAdapter; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 

public class Mains implements KeyListener { 
    private static Point point = new Point(); 

    public Mains() { 
     final JFrame frame = new JFrame(); 
     frame.setUndecorated(true); 
     JButton button = new JButton("Close Me"); 
     button.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       System.exit(0); 
      } 
     }); 

     frame.addMouseListener(new MouseAdapter() { 
      public void mousePressed(MouseEvent e) { 
       point.x = e.getX(); 
       point.y = e.getY(); 
      } 
     }); 
     frame.addMouseMotionListener(new MouseMotionAdapter() { 
      public void mouseDragged(MouseEvent e) { 
       Point p = frame.getLocation(); 
       frame.setLocation(p.x + e.getX() - point.x, p.y + e.getY() 
         - point.y); 
      } 
     }); 

     frame.setSize(300, 300); 
     frame.setLocation(200, 200); 
     frame.setLayout(new BorderLayout()); 

     frame.getContentPane().add(button, BorderLayout.NORTH); 
     frame.getContentPane().add(new JLabel("Drag Me", JLabel.CENTER), 
       BorderLayout.CENTER); 
     frame.setVisible(true); 
     frame.addKeyListener(this); 
    } 

    public static void main(String[] args) { 
     new Mains(); 
    } 

    public void keyPressed(KeyEvent e) { 
     System.out.println("pressed"); 
    } 

    public void keyReleased(KeyEvent e) { 
     System.out.println("released"); 
    } 

    public void keyTyped(KeyEvent e) { 

    } 
} 

답변

4

기본적으로 JFrame 창 구성 요소에는 포커스가 없습니다. 으로 전화 할 수 있지만 JFrame.setFocusable(true)으로 전화하면 Key Bindings을 사용하는 것이 훨씬 더 좋습니다.

KeyListenerKeyEvents과의 상호 작용을 위해 구성 요소에 초점을 맞춰야합니다. 대조적으로, Key Bindings를 사용하는 경우 구성 요소에 포커스가없는 경우에도 Action을 KeyStroke에 매핑 할 수 있습니다.

+0

감사를 찾을 수 있습니다 key bindings

를 사용하는 것이 좋습니다, 거의 선택의 오른쪽 API입니다. 물론 다른 코드에서는 setFocusable (true) 메서드를 추가 한 곳이 없었지만 코드가 제대로 작동 했으므로 나를 계몽 할 수 있습니까? –

+0

업데이트를 참조하십시오. Swing에서 사용하기 위해'Key Bindings'를 추천합니다. – Reimeus

4

KeyListerner은 연결된 구성 요소가 포커스를 받고 포커스를받을 수있는 경우에만 키 이벤트를 수신 할 수 있습니다.

JFrame의 문제점은 프레임의 전체 표면을 차지하는 콘텐츠 창이 들어있는 JRootPane을 포함하고있어 프레임이 포커스를 얻지 못하게합니다. 키 이벤트를 수신 할 수 없기 때문입니다.

KeyListener 일반적으로, 그것은 또한 문제를 해결 관심의 How to use root panes

관련 문제